我需要在我的项目中使用 tools.jar,但是将它打包到 jar 中没有多大意义,因为用户已经拥有它。那么,是否可以将其用作“动态依赖项”?意思是,我希望我的代码使用在 my 中找到的文件进行编译,但我不希望它与它一起打包。我可以确保将其添加到类路径中,并在运行时使用用户的双重激活来代替。例如:tools.jar
JAVA_HOME
JAVA_HOME
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
}
仅供参考:我使用程序集插件将应用程序打包在一个独立的 jar 文件中。
编辑:
一个丑陋的解决方案是将tools.jar
文件复制到我项目中的 lib 目录中,并添加:
excludedJars in assembly <<= (fullClasspath in assembly) map { cp =>
cp filter {_.data.getName == "tools.jar"}
}
在build.sbt
不复制jar文件的情况下可以做得更优雅吗?切换 JVM 并自动使用“正确”文件会更容易tools.jar
......