4

我需要在我的项目中使用 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......

4

3 回答 3

6

在仔细阅读了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"}
}

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

于 2012-09-20T07:48:32.580 回答
2

现在有一个 sbt 插件可以为您执行此操作:https ://github.com/chipsenkbeil/sbt-jdi-tools

于 2017-10-13T13:08:23.870 回答
-1

我还没有对此进行测试,但是您能否不使用 % 配置语法仅将依赖项映射到运行时或编译?无论如何,肯定应该自动包含 tools.jar 吗?

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

我不确定“系统”配置,我知道这在 Maven 中有效,但您可以尝试使用“编译”来代替。

于 2012-09-14T13:18:16.087 回答