是否有一个工具或脚本可以轻松地将一堆JAR文件合并到一个JAR文件中?奖励是轻松设置主文件清单并使其可执行。
具体案例是Java restructured text tool。我想用以下的方式运行它:
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的基于胖JAR的“Runnable JAR导出向导”。我发现这很容易用于部署我自己的代码。
对于非Eclipse环境中的构建,其他一些优秀的建议可能更好,oss可能应该使用Ant进行良好的构建。 (Maven,到目前为止刚刚给了我痛苦,但其他人都喜欢它。)
答案 0 :(得分:62)
Ant的zipfileset
完成工作
<jar id="files" jarfile="all.jar">
<zipfileset src="first.jar" includes="**/*.java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
答案 1 :(得分:33)
Eclipse 3.4 JDT的Runnable JAR导出向导。
在Eclipse 3.5中,这已经扩展。现在,您可以选择处理引用的JAR文件的方式。
答案 2 :(得分:27)
尝试了一些不同的解决方案后,我发现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”):
<target name="jar-rst">
<one-jar destfile="rst.jar" manifest="rst.mf">
<main jar="jrst-0.8.1.jar" />
<lib>
<fileset dir="${pathToJars}">
<include name="batik-util-1.6-1.jar" />
<include name="icu4j-2.6.1.jar" />
<include name="commons-collections-3.1.jar" />
<!-- Snip -->
</fileset>
</lib>
</one-jar>
</target>
答案 3 :(得分:14)
如果您是Maven用户,通常程序集插件可以执行您想要的操作,或者可能使用阴影插件,在某些情况下可以使用组合插件。
使用程序集插件,您可以在项目中使用任何必要的设置放置清单文件,但默认值通常非常好。然后使用
完成构建mvn assembly:assembly
或者如果你有更多特殊的事情需要处理,那么其他目标之一。要包含的所有JAR文件都由Maven的依赖解析器选取。如果您使用shade插件,它通常是安装目标的一部分,并且在我现在正在做的一个特定项目中
mvn install
mvn assembly:single
assembly:single
目标是解决生命周期问题,在本例中是Spring应用程序。
答案 4 :(得分:8)
ProGuard不仅将您的JAR文件打包成一个,而且还可以优化,清理或混淆您的类文件,使得生成的JAR文件比以前所有JAR文件的总和小得多。
我实际上使用JRST工具尝试过ProGuard,就像你报道的那样。我试图追踪问题并发现它与jrst引用的ICU4J库中的a bug相关。问题是,使用过的ICU版本现在已经过时了。所以我用ICU4J版本3.2替换了icu.jar
文件。现在,ProGuard在JRST库中找到了许多关于意外事件的错误/警告。
我的猜测是ProGuard按预期工作,但jrst的库只是不一致。我不知道你是否可以做更多的事情而不是与开发人员交谈,因为他们应该检查并更新项目的依赖关系。
答案 5 :(得分:8)
您可以使用JarJar来使用包阴影来确保您的JAR文件不与其他文件冲突。
答案 6 :(得分:7)
(基于Andrian的):
<jar id="files" jarfile="all.jar">
<zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/>
<zipfileset src="first.jar" includes="**/*.java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.java **/*.class"/>
<fileset dir=".">
<include name="LICENSE"/>
<include name="NOTICE"/>
</fileset>
</jar>
答案 7 :(得分:5)
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基于不同的代码库。
答案 8 :(得分:3)
有一个名为autojar的工具,它将扫描你的字节码并使用它找到的类编译.jar文件,包括引用的(导入的)类。
但是,并不总是使用像Spring这样的东西,你在配置中指定类名并由框架加载。
答案 9 :(得分:3)
或使用Maven程序集插件(mvn程序集:程序集)
答案 10 :(得分:2)
我认为您需要的工具是 JarSplice :http://ninjacave.com/jarsplice
确实不需要Ant或Maven,有自己的GUI,使用起来很简单,完全按照你的要求行事 - &gt; 它将几个jar文件的内容合并为一个 (请注意,它仍然需要添加自己的类加载器)。
答案 11 :(得分:0)
你应该使用maven着色插件来做到这一点。我经常使用maven来构建独立的jar文件,它非常强大
查看更多:
http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
答案 12 :(得分:-4)
听起来像Apache Ant就是你想要的。