我需要在我的項目中使用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,並自動使用「正確的」文件...
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' –
感謝您的反饋@giladhoch。正如我所提到的,我不確定'system'配置,並且建議使用'compile'或'runtime'配置進行測試,看看它是否有效。 – Brett
正確的配置將被「提供」,但它不會工作,因爲tools.jar沒有發佈到任何maven回購(儘管您可以發佈到私人回購)。此外,你會想運行一個匹配運行時java的代碼。因此,使用'unmanagedJars'是這裏的正確解決方案。 –