是否有一个工具或脚本可以轻松地将一堆JAR文件合并到一个JAR文件中?奖励是轻松设置主文件清单并使其可执行.
具体案例是Java重组文本工具.我想用以下的方式运行它:
java -jar rst.jar
据我所知,它没有依赖关系,表明它不应该是一个简单的单文件工具,但下载的ZIP文件包含很多库.
0 11-30-07 10:01 jrst-0.8.1/ 922 11-30-07 09:53 jrst-0.8.1/jrst.bat 898 11-30-07 09:53 jrst-0.8.1/jrst.sh 2675 11-30-07 09:42 jrst-0.8.1/readmeEN.txt 108821 11-30-07 09:59 jrst-0.8.1/jrst-0.8.1.jar 2675 11-30-07 09:42 jrst-0.8.1/readme.txt 0 11-30-07 10:01 jrst-0.8.1/lib/ 81508 11-30-07 09:49 jrst-0.8.1/lib/batik-util-1.6-1.jar 2450757 11-30-07 09:49 jrst-0.8.1/lib/icu4j-2.6.1.jar 559366 11-30-07 09:49 jrst-0.8.1/lib/commons-collections-3.1.jar 83613 11-30-07 09:49 jrst-0.8.1/lib/commons-io-1.3.1.jar 207723 11-30-07 09:49 jrst-0.8.1/lib/commons-lang-2.1.jar 52915 11-30-07 09:49 jrst-0.8.1/lib/commons-logging-1.1.jar 260172 11-30-07 09:49 jrst-0.8.1/lib/commons-primitives-1.0.jar 313898 11-30-07 09:49 jrst-0.8.1/lib/dom4j-1.6.1.jar 1994150 11-30-07 09:49 jrst-0.8.1/lib/fop-0.93-jdk15.jar 55147 11-30-07 09:49 jrst-0.8.1/lib/activation-1.0.2.jar 355030 11-30-07 09:49 jrst-0.8.1/lib/mail-1.3.3.jar 77977 11-30-07 09:49 jrst-0.8.1/lib/servlet-api-2.3.jar 226915 11-30-07 09:49 jrst-0.8.1/lib/jaxen-1.1.1.jar 153253 11-30-07 09:49 jrst-0.8.1/lib/jdom-1.0.jar 50789 11-30-07 09:49 jrst-0.8.1/lib/jewelcli-0.41.jar 324952 11-30-07 09:49 jrst-0.8.1/lib/looks-1.2.2.jar 121070 11-30-07 09:49 jrst-0.8.1/lib/junit-3.8.1.jar 358085 11-30-07 09:49 jrst-0.8.1/lib/log4j-1.2.12.jar 72150 11-30-07 09:49 jrst-0.8.1/lib/logkit-1.0.1.jar 342897 11-30-07 09:49 jrst-0.8.1/lib/lutinwidget-0.9.jar 2160934 11-30-07 09:49 jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar 301249 11-30-07 09:49 jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar 68610 11-30-07 09:49 jrst-0.8.1/lib/sdoc-0.5.0-beta.jar 3149655 11-30-07 09:49 jrst-0.8.1/lib/xalan-2.6.0.jar 1010675 11-30-07 09:49 jrst-0.8.1/lib/xercesImpl-2.6.2.jar 194205 11-30-07 09:49 jrst-0.8.1/lib/xml-apis-1.3.02.jar 78440 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar 86249 11-30-07 09:49 jrst-0.8.1/lib/xmlunit-1.1.jar 108874 11-30-07 09:49 jrst-0.8.1/lib/xom-1.0.jar 63966 11-30-07 09:49 jrst-0.8.1/lib/avalon-framework-4.1.3.jar 138228 11-30-07 09:49 jrst-0.8.1/lib/batik-gui-util-1.6-1.jar 216394 11-30-07 09:49 jrst-0.8.1/lib/l2fprod-common-0.1.jar 121689 11-30-07 09:49 jrst-0.8.1/lib/lutinutil-0.26.jar 76687 11-30-07 09:49 jrst-0.8.1/lib/batik-ext-1.6-1.jar 124724 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar
如您所见,有些人不希望手动执行此操作.
到目前为止,我只尝试过AutoJar和ProGuard,两者都很容易运行.似乎JAR文件中的常量池存在一些问题.
显然jrst有点破,所以我会去解决它.在Maven的 pom.xml
文件显然是打破过,所以我必须解决这个问题JRST固定之前......我觉得自己像一个错误磁铁:-)
更新:我从来没有修复过这个应用程序,但是我查看了Eclipse的"Runnable JAR export wizard",它基于一个胖JAR.我发现这很容易用于部署我自己的代码.
对于非Eclipse环境中的构建,其他一些优秀建议可能更好,oss可能应该使用Ant进行很好的构建.(Maven,到目前为止刚刚给了我痛苦,但其他人喜欢它.)
Ant's zipfileset
完成了这项工作
Eclipse 3.4 JDT的Runnable JAR导出向导.
在Eclipse 3.5中,这已经扩展.现在,您可以选择处理引用的JAR文件的方式.
尝试了一些不同的解决方案之后,我发现One-JAR 最容易使用,并且设法做到了这一点:生成一个包含我需要的所有内容的可执行JAR.
One-JAR使用可以导航嵌套资源的自定义类加载器.查看下载中的.bat文件,看起来jrst-0.8.1.jar中的org.codelutin.jrst.JRST是主类,因此您的清单应如下所示:
Main-Class: com.simontuffs.onejar.Boot One-Jar-Main-Class: org.codelutin.jrst.JRST
非常酷的是,One-JAR将为您处理传递命令行参数.类路径由自定义类加载器处理,假设您需要的所有资源都捆绑到单个JAR中.
使用One-JAR的最简单方法是使用ant; 有一个自定义的"one-jar"ant任务,其工作方式如下(假设你的清单叫做"rst.mf"):
如果您是Maven用户,通常组装插件可以执行您想要的操作,或者可能使用阴影插件,在某些情况下还可以组合使用.
使用程序集插件,您可以在项目中使用任何必要的设置放置清单文件,尽管默认值通常非常好.然后建造完成
mvn assembly:assembly
或者,如果你有更多特殊的事情需要处理,那么其他目标之一.要包含的所有JAR文件都由Maven的依赖解析器选取.如果您使用shade插件,它通常是安装目标的一部分,并且在我正在做的一个特定项目中
mvn install mvn assembly:single
该assembly:single
目标是解决问题的寿命,在这种情况下,在一个春天的应用.
有ProGuard的不只是收拾你的JAR文件合并为一个,但它也可以优化,清理或混淆您的类文件,使所产生的JAR文件比以前所有的JAR文件的总和小得多.
我实际上用JRST工具尝试过ProGuard,就像你报道的那样.我试图追踪问题并发现它与jrst引用的ICU4J库中的错误有关.问题是,使用过的ICU版本现在已经过时了.所以我icu.jar
用ICU4J版本3.2 替换了该文件.现在,ProGuard发现了一系列关于JRST库的紧急情况的错误/警告.
我的猜测是ProGuard按预期工作,但jrst的库只是不一致.我不知道你是否可以做更多的事情而不是与开发人员交谈,因为他们应该检查和更新项目的依赖关系.
您可以使用JarJar,它将使用包镜像来确保您的JAR文件不会与其他文件冲突.
(基于安德里安的):
One-JAR 0.97刚刚在http://one-jar.sourceforge.net上发布,它已经扩展,支持Spring和Guice等框架,这可能给其他方法带来麻烦.它还处理classloader-inversion - 其中一些JAR文件在One-JAR外部(例如,可能不捆绑的JDBC驱动程序).
One-JAR是命令行,带有Ant和Maven 2插件.使用"jar"工具构建也很简单.
我还可以推荐Ference Hechler写的Eclipse Jar Exporter(Runnable):他在提出一个包装一组JAR文件的简单方法方面做得很好.他和我在One-JAR上工作,但Jar Exporter基于不同的代码库.