2012-09-13 40 views
3

我需要在我的項目中使用tools.jar,但沒有太多意義將它打包在jar中,因爲用戶已經擁有了它。那麼,是否有可能將其用作「動態依賴」?意思是,我想我的代碼編譯通過使用tools.jar文件在我的JAVA_HOME,但我不希望它與它打包。我可以確保在運行時將其添加到類路徑中,並使用用戶的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 
} 

僅供參考:我使用assembly插件在獨立的jar文件中打包應用程序。

編輯:

一個醜陋的解決辦法是在tools.jar文件複製到lib目錄在我的項目,並添加:

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

build.sbt 能不能更優雅的完成,無需複製jar文件?將更容易切換JVM,並自動使用「正確的」文件...

回答

5

更仔細的SBT Documentation看完之後,我發現瞭如何做到這一點:在build.sbt
我需要添加:

// 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 

我不知道有關「系統」的配置,我知道這個作品在行家,你可以用「編譯」來代替,雖然嘗試。

+0

iv'e allready試過了...(順便說一下,它是''system'''''''''')。我得到這個錯誤: '[error] {file:/ 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的'系統',因爲這個配置不存在! [error]總時間:0 s,已完成2012年9月15日7:54:45' –

+0

感謝您的反饋@giladhoch。正如我所提到的,我不確定'system'配置,並且建議使用'compile'或'runtime'配置進行測試,看看它是否有效。 – Brett

+1

正確的配置將被「提供」,但它不會工作,因爲tools.jar沒有發佈到任何maven回購(儘管您可以發佈到私人回購)。此外,你會想運行一個匹配運行時java的代碼。因此,使用'unmanagedJars'是這裏的正確解決方案。 –

0

現在有一個sbt插件可以爲你做這件事:https://github.com/chipsenkbeil/sbt-jdi-tools

+0

這個插件簡單地添加了依賴關係。 這個問題(現在已經很老了,並且比插件早幾年)詢問如何在不添加到打包應用程序的情況下針對'tools.jar'進行編譯。 'tools.jar'的問題是它*應該*匹配運行時java。使用哪個JDK編譯程序並不重要,運行它的JDK可能不同,並且您需要添加這些「工具」。jar'動態在運行時。 –