75

是否有工具或脚本可以轻松地将一堆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 之前修复它......我觉得自己像一个错误磁铁 :-)


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

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

4

13 回答 13

62

蚂蚁的zipfileset工作

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
于 2008-10-08T22:09:10.747 回答
34

Eclipse 3.4 JDT 的 Runnable JAR 导出向导。

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

于 2008-09-17T09:08:56.760 回答
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>
于 2008-09-17T09:32:54.317 回答
14

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

使用程序集插件,您可以在项目中放置一个带有任何必要设置的清单文件,尽管默认值通常非常好。然后构建完成

mvn assembly:assembly

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

mvn install
mvn assembly:single

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

于 2008-09-17T08:57:37.147 回答
9

ProGuard不仅可以将您的 JAR 文件打包成一个,还可以优化、清理或混淆您的类文件,使生成的 JAR 文件比之前所有 JAR 文件的总和小得多。

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

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

于 2008-09-17T09:38:10.467 回答
8

您可以使用JarJar,它将使用包阴影来确保您的 JAR 文件不会与其他文件冲突。

于 2008-09-22T16:10:31.877 回答
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>
于 2011-04-13T16:46:43.703 回答
5

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

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

我还可以推荐 Eclipse Jar Exporter (Runnable),Ference Hechler 在上面写道:他在提出一种简单的方法来包装一组 JAR 文件方面做得很好。他和我在 One-JAR 上工作,但 Jar Exporter 基于不同的代码库。

于 2010-07-17T07:17:22.050 回答
3

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

但是,它并不总是适用于 Spring 之类的东西,您在配置中指定类名并由框架加载。

于 2008-09-17T08:59:07.580 回答
3

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

于 2008-09-17T09:40:03.753 回答
2

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

不需要Ant 或 Maven,有自己的 GUI,使用起来很简单,完全按照你的要求做 -->它将几个 jar 文件的内容合并到一个文件中(请注意它仍然需要添加自己的类加载器)。

于 2015-06-07T21:00:41.987 回答
0

您应该使用 maven 着色插件来做到这一点。我经常使用maven构建独立的jar文件,它非常强大

看更多:

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

于 2014-06-12T16:31:34.663 回答
-4

听起来Apache Ant就是您正在寻找的东西。

于 2008-09-17T08:58:03.590 回答