如何添加的tools.jar在SBT一个“动态依赖”。 可能吗?(how to add tool

2019-07-31 14:01发布

我需要在我的项目中使用的tools.jar,但没有太大的意义将它打包在罐子,因为用户已经拥有了它。 那么,是否可以使用它作为一个“动态依赖症”? 意思,我希望我的代码将使用编译 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
}

FYI:我装箱率使用插件组装在一个独立的jar文件的应用程序。

编辑:

一个丑陋的解决办法是在复制tools.jar文件到lib目录在我的项目,并添加:

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

build.sbt能不能更优雅的完成,无需复制的jar文件? 会更容易切换的JVM,并使用“正确” tools.jar自动文件...

Answer 1:

更仔细阅读后SBT文档 ,我发现了如何做到这一点:
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"}
}

这就是它...就这么简单:)



Answer 2:

有一个SBT插件为你做这个现在: https://github.com/chipsenkbeil/sbt-jdi-tools



Answer 3:

我没有测试过这一点,但你能不能使用%配置语法仅依赖映射到运行时或编译? 肯定的tools.jar应自动反正包括在内?

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

我不知道的“系统”的配置,我知道这个作品在行家,你可以用“编译”来代替,虽然尝试。



文章来源: how to add tools.jar as a “dynamic dependency” in sbt. is it possible?