将发行版合并到一个JAR文件中的最简单的方法

有没有一个工具或脚本轻松地将一堆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之前我必须解决这个问题。我觉得自己像一个bug磁铁:-)


更新:我从来没有去解决这个应用程序,但我检查了基于胖JAR的Eclipse的“Runnable JAR导出向导”。 我发现这很容易用于部署我自己的代码。

其他一些优秀的build议可能会更适合在非Eclipse环境中构build,oss可能应该使用Ant进行良好的构build。 (Maven,迄今为止只是给了我痛苦,但其他人也喜欢它。)

Eclipse 3.4 JDT的Runnable JAR导出向导。

在Eclipse 3.5中,这已经被扩展。 现在你可以select你想如何对待你引用的JAR文件。

Ant的zipfileset完成这项工作

 <jar id="files" jarfile="all.jar"> <zipfileset src="first.jar" includes="**/*.java **/*.class"/> <zipfileset src="second.jar" includes="**/*.java **/*.class"/> </jar> 

尝试了几种不同的解决scheme之后,我发现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会为你处理命令行parameter passing。 假设您需要的所有资源都捆绑到单个JAR中,那么类path将由自定义类加载器处理。

使用One-JAR最简单的方法是使用ant; 有一个自定义的“单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> 

如果你是一个Maven用户,通常程序集插件可以做你想做的,或者可能是阴影插件,在某些情况下是组合。

使用程序集插件,您可以使用任何必要的设置将清单文件放入项目中,但默认情况通常很好。 大厦然后完成

 mvn assembly:assembly 

或者如果你有更多特殊的事情要处理,其他目标之一。 所有包含的JAR文件都由Maven的依赖parsing器提取。 如果你使用阴影插件,它通常是安装目标的一部分,在我现在正在做的一个特定项目中

 mvn install mvn assembly:single 

assembly:single目标是解决生命周期问题,在这种情况下在Spring应用程序中。

您可以使用JarJar ,它将使用包shadowing,以确保您的JAR文件不与其他人冲突。

ProGuard不仅可以将JAR文件打包成一个文件,还可以对您的类文件进行优化,清理或模糊处理,从而使得生成的JAR文件远小于之前所有JAR文件的总和。

我实际上用JRST工具尝试了ProGuard,正如你所报道的那样。 我试图跟踪这个问题,发现它涉及到jrst引用的ICU4J库中的一个bug 。 问题是,使用的ICU版本现在已经过时了。 所以我用ICU4J版本3.2replace了icu.jar文件。 现在,ProGuard发现了一些关于与JRST图书馆合作的错误/警告。

我的猜测是ProGuard按预期工作,但是jrst的库并不一致。 我不知道你是否可以做更多的事情,而不是与开发者交谈,因为他们应该检查和更新项目的依赖关系。

(基于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> 

One-JAR 0.97刚刚在http://one-jar.sourceforge.net上发布,并且已经扩展到支持Spring和Guice等框架,这可能会给其他方法带来麻烦。; 它还处理类加载器反转 – 其中一些JAR文件是One-JAR外部的(例如,可能不捆绑的JDBC驱动程序)。

One-JAR是命令行,带有Ant和Maven 2插件。 使用“jar”工具进行构build也很简单。

我也可以推荐Ference Hechler在其中写道的Eclipse Jar Exporter(Runnable):他做了一个很好的工作来提供一个包装一组JAR文件的简单方法。 他和我一起工作了一个JAR,但Jar Exporter是基于不同的代码库。

有一个名为autojar的工具,它将扫描你的字节码并用它find的类(包括引用的类)编译一个.jar文件。

但是,并不总是像Spring那样工作,但是在configuration中指定了类名,并且它被框架加载了。

或者使用Maven程序集插件(mvn assembly:assembly)

我认为你需要的工具是JarSplice : http : //ninjacave.com/jarsplice

它不需要Ant或Maven,有它自己的GUI,它很简单,直接使用和做你正在问什么 – > 它合并几个jar文件的内容到一个单一的 (请注意,它仍然需要添加自己的类加载器)。

你应该使用Maven的阴影插件来做到这一点。 我经常使用maven来构build独立的jar文件,它非常强大

查看更多:

http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

听起来像Apache的ant是你在找什么。