【问题标题】:How to use jarjar from the command-line?如何从命令行使用 jarjar?
【发布时间】:2010-11-30 17:57:05
【问题描述】:

我无法从命令行使用 jarjar 将简单的 Scala 程序与 scala 运行时库结合起来。

jarjar 正确检测到依赖关系:

$ java -jar ~/Desktop/saug/jarjar-1.0.jar find jar BCT.jar scala-library.jar
/home/schani/Work/scala/bct/BCT.jar -> /home/schani/Work/scala/bct/scala-library.jar

然而,将它们组合起来是行不通的:

$ CLASSPATH=./scala-library.jar java -jar ~/Desktop/saug/jarjar-1.0.jar process rules.jjl BCT.jar BCTS.jar

我得到的 jar 文件仍然依赖于 scala-library.jar。我是否添加 CLASSPATH 变量没有区别。我的 rules.jjl 文件如下所示:

keep BCT

怎么办?

【问题讨论】:

  • 这只是一个绝地思维技巧。希望它不会让你感到太多......

标签: java scala jar jarjar


【解决方案1】:

使用 java “-jar” 选项会忽略类路径。尝试使用类路径显式指定主类,并省略“-jar”:

java -cp ~/Desktop/saug/jarjar-1.0.jar:./scala-library.jar com.tonicsystems.jarjar.Main process rules.jjl BCT.jar BCTS.jar

【讨论】:

  • 对我来说,更具体地说,它创建了一个仅包含 BCT.jar 的 jar。我不想重命名任何包,而是收集所有依赖项。因此,在规则中,我对 BCT.jar 中的主类的包有一个保留规则
【解决方案2】:

尝试为 scala.runtime.Nothing$ 类添加一个保持。在使用 Scala 的类似产品(autojar;http://autojar.sourceforge.net/en_d/index.html)时,我发现这是必要的。

【讨论】:

  • 那也行不通。 jarjar 似乎只从命令行指定的输入 jar 文件中获取类,而不是从任何依赖的 jar 中获取类,而且似乎没有办法指定它们。
【解决方案3】:

jarjar 不会将其他 jar 重新打包到您的 jar 中。它只会重命名一个 jar 本身内部的依赖项。

使用此处列出的方法Clean way to combine multiple jars? Preferably using Ant 将所有依赖的 jar 重新打包到您的 jar 中,然后运行 ​​jarjar 以防止将来出现依赖地狱。

【讨论】:

  • 其实,仅仅使用ant任务重新压缩并不是最理想的解决方案。我使用 eclipse fat-jar 插件来做到这一点。基本上,创建一个空项目并将所有 jar 放入项目的构建路径中,然后使用 fat-jar 插件fjep.sourceforge.net 导出到 fat jar。
猜你喜欢
  • 2012-09-23
  • 2011-10-17
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2012-10-25
相关资源
最近更新 更多