2012-09-13 3 views
3

내 프로젝트에서 tools.jar을 사용해야하지만 사용자가 이미 가지고 있기 때문에 jar 파일에 패키지하는 것이별로 의미가 없습니다. 그래서, 그것을 "동적 종속성"으로 사용할 수 있습니까? 의미, 내 코드 JAVA_HOME에서 찾을 tools.jar 파일을 사용하여 컴파일해야하지만, 나는 그것을 함께 포장 싶지 않아요. 런타임에 이중 활성화를 사용하여 classpath에 추가하려면 사용자의JAVA_HOME 대신 사용하십시오. 예 :sbt에서 "동적 종속성"으로 tools.jar를 추가하는 방법. 그것은 가능한가?

object Main1 extends App { 
    val myjar = Main1.getClass.getProtectionDomain.getCodeSource.getLocation.getFile 
    val tools = System.getProperty("java.home").dropRight(3)+"lib/tools.jar" // drop "jre" 
    val arguments = Array("java", "-cp", myjar+":"+tools, "me.myapp.Main2") ++ args 
    val p = Runtime.getRuntime.exec(arguments) 
    p.getErrorStream.close 
    p.getOutputStream.close 
} 

FYI : 독립 실행 형 jar 파일의 어셈블리 플러그인을 사용하여 앱을 압축합니다.

편집 :

못생긴 솔루션 내 프로젝트에 lib 디렉토리에 tools.jar 파일을 복사하고 추가하는 것입니다 : build.sbt 에서

excludedJars in assembly <<= (fullClasspath in assembly) map { cp => 
    cp filter {_.data.getName == "tools.jar"} 
} 

가 더 우아하게 수행 할 수 있습니다, jar 파일을 복사하지 않고? "오른쪽"tools.jar 파일을 자동으로 사용하십시오.

답변

5

더주의 깊게 SBT Documentation 읽은 후, 나는이 작업을 수행하는 방법을 발견

// adding the tools.jar to the unmanaged-jars seq 
unmanagedJars in Compile ~= {uj => 
    Seq(Attributed.blank(file(System.getProperty("java.home").dropRight(3)+"lib/tools.jar"))) ++ uj 
} 

// exluding the tools.jar file from the build 
excludedJars in assembly <<= (fullClasspath in assembly) map { cp => 
    cp filter {_.data.getName == "tools.jar"} 
} 

을하고는 :)로 ... 그것에 대해

-1

테스트하지는 않았지만 % 구성 구문을 사용하여 종속성을 런타임에만 매핑하거나 컴파일 할 수는 없습니까? ? Tools.jar은 자동으로 포함되어야합니다.

libraryDependencies += "com.sun" % "tools" % "1.6.0" % system 

나는 이것이 받는다는에서 작동 알고, "시스템"구성에 대한 확실하지 않다, 대신하지만 "컴파일"로이 시도 할 수 있습니다. 내가 추가 할 필요 build.sbt에서
을 :

+0

iv'e allready 그것을 시도했습니다 ... (BTW, 그것은 "system"이 아닌'system'입니다). 이 오류가 발생합니다 : '[오류] {파일 :/home/gilad/workspace_eclipse/app-using-tools /} root/* : update : java.lang.IllegalArgumentException : 종속성을 추가 할 수 없습니다 'com.sun # tools; 1.6 .0 '을 모듈 me.myapp # app-using-tools_2.9.2; 0.1의 구성'system '으로 설정하면이 구성이 존재하지 않기 때문에 0.1! [오류] 총 시간 : 0 초 완료 2012 년 9 월 15 일 7:54:45 PM ' –

+0

@giladhoch에게 감사드립니다. 언급했듯이, 나는'system' 설정에 대해 확신 할 수 없었고,'compile' 또는'runtime' 설정을 테스트 해 보도록 제안했습니다. – Brett

+1

올바른 설정은''''제공 될 것이지만, tools.jar가 어떤 메이븐 레포에 게시되지 않았기 때문에 작동하지 않을 것입니다 (개인 레포에 게시 할 수는 있지만). 게다가, 당신은 런타임 자바와 일치하는 코드에 대해 실행하고 싶을 것이다. 그래서'unmanagedJars'를 사용하는 것이 올바른 해결책입니다. –

0
간단합니다

지금 당신을 위해 이것을 할 sbt 플러그인이 있습니다 : https://github.com/chipsenkbeil/sbt-jdi-tools

+0

이 플러그인은 단순히 의존성을 추가합니다. (꽤 오래되었고 플러그인을 몇 년 앞선다.) 질문은 패키지 도구에 추가하지 않고'tools.jar'에 대해 컴파일하는 방법을 묻습니다. 'tools.jar '의 문제점은 런타임 자바와 일치해야한다는 것입니다. 어떤 JDK가 프로그램을 컴파일하는데 사용 되었건간에, 실행하는 JDK는 다를 수 있으며'tools를 추가하고 싶을 것이다.jar'를 동적으로 실행합니다. –