2008-09-17 96 views
70

是否有工具或脚本可以轻松地将一堆JAR文件合并到一个JAR文件中?一个好处是可以轻松设置主文件清单并使其可执行。将发布合并到一个JAR文件中的最简单方法

具体案例是Java restructured text tool。我想的东西,如运行:

Java的罐子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是有点破,所以我会去修复它。该Mavenpom.xml文件显然是打破过,所以我必须解决这个问题JRST固定之前......我觉得自己像一个错误磁铁:-)


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

其他一些极好的建议可能会更适合在非Eclipse环境中构建,oss可能应该使用Ant进行构建。 (到目前为止,Maven给我带来了痛苦,但其他人却喜欢它。)

+0

http://www.jdotsoft.com/JarClassLoader.php – gorokhmn 2010-03-02 14:05:26

+0

[Fat Jar Eclipse Plugin](http://fjep.sourceforge.net/) – 2008-09-17 09:07:13

+0

[One-Jar](http:// one-jar。 sourceforge.net/) – 2008-09-17 09:04:48

回答

33

Eclipse 3.4 JDT的Runnable JAR导出向导。

在Eclipse 3.5中,这已被扩展。现在你可以选择你想如何处理你引用的JAR文件。

+0

您可以检查生成的蚂蚁脚本是否可用?之前有一个绝对文件路径而不是相对的问题。 – 2009-11-28 10:06:01

14

如果您是Maven用户,通常程序集插件会根据您的需要或可能的阴影插件以及某些情况下的组合。

使用程序集插件,您可以使用任何必要的设置将清单文件放入项目中,但默认值通常很好。然后建筑物与

mvn assembly:assembly 

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

mvn install 
mvn assembly:single 

assembly:single目标是解决问题的寿命,在这种情况下,一个Spring申请。

3

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

并不总是像春天工作,虽然,在这里您可以指定配置的类名,并得到由框架加载。

+0

感谢您的指针,似乎在这个特定的应用程序中的一些.jars让我感到头疼。 – tovare 2008-09-17 13:31:04

27

已经尝试了几种不同的解决方案,我发现One-JAR最简单的工作,并设法做到这一点:产生一个单一的,可执行的JAR,其中包含我需要的一切。

One-JAR使用可以导航嵌套资源的自定义类加载器。看看在下载.bat文件,它看起来像org.codelutin.jrst.JRST在JRST-0.8.1.jar是主类,所以你的表现应该是这样的:

Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Main-Class: org.codelutin.jrst.JRST 

的非常酷的事情是One-JAR会为你处理传递命令行参数。假定您需要的所有资源都捆绑到单个JAR中,那么类路径由自定义类加载器处理。

使用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> 
+1

蚂蚁一个罐子的可编码性使其可用于连续构建系统。 – 2009-11-28 10:07:00

+0

1.如果在我的jar中有几个应用程序(几个入口点类),One-JAR是否可用? 2.如果这个jar被另一个应用程序使用,它可以使用“One-JAR”中的嵌套jar文件中的类吗? – MRalwasser 2012-05-02 10:09:47

8

ProGuard这不仅收拾你的JAR文件合并为一个,但它还可以优化,清理或混淆您的类文件,使得生成的JAR文件比之前的所有JAR文件的总和小得多。

我实际上已经使用JRST工具试用了ProGuard,并且正如您所报告的那样。我试图跟踪这个问题,发现它与jrst引用的ICU4J库中的a bug有关。问题是,使用的ICU版本现在已经过时了。所以我用ICU4J版本3.2替换了icu.jar文件。现在,ProGuard发现了一堆关于JRST图书馆失灵的其他错误/警告。

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

+0

谢谢!我下载了它并尝试了一下,但是在这个特殊领域,它用icu4j-2.6.1.jar, – tovare 2008-09-17 10:36:20

3

或使用Maven的组装插件(MVN组装:组装)

8

您可以使用JarJar将使用软件包阴影,以确保您的JAR文件不与他人发生冲突。

63

Ant的zipfileset确实

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

一JAR 0.97刚刚在http://one-jar.sourceforge.net发布,并一直延续王氏为框架,如SpringGuice,这可能会出现麻烦其他方法支持这项工作。它还处理类加载器反转 - 其中一些JAR文件位于One-JAR的外部(例如,可能未捆绑发货的JDBC驱动程序)。

One-JAR是命令行,带有AntMaven 2个插件。使用“jar”工具进行构建也很简单。

我也可以推荐Ference Hechler在其中写道的Eclipse Jar Exporter(Runnable):他在创建一个包装一组JAR文件的简单方法方面做得非常出色。他和我一起工作过One-JAR,但Jar Exporter基于不同的代码库。

7

(基于安德里安的):

<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> 
2

我认为你需要这里的工具是JarSplicehttp://ninjacave.com/jarsplice

它确实不是需要Ant或Maven,有它自己的图形用户界面,使用起来很直截了当,并且完全按照你的要求去做 - >它合并几个j的内容ar文件合并为一个文件(请注意,它仍然需要添加自己的类加载器)。

相关问题