有没有一个工具或脚本可以轻松合并一堆 文件合并到一个 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 有点坏了,所以我会尽力修复它。这 梅文 pom.xml 文件显然也被破坏了,所以我必须在修复 jrst 之前修复它......我感觉自己就像一块吸引虫子的磁铁:-)


更新:我从来没有抽出时间来修复这个应用程序,但我检查了 的“可运行 JAR 导出向导”基于 fat JAR。我发现这非常容易用于部署我自己的代码。

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

有帮助吗?

解决方案

Eclipse 3.4 JDT 的 Runnable JAR 导出向导。

在 Eclipse 3.5 中,这一点得到了扩展。现在您可以选择如何处理引用的 JAR 文件。

其他提示

蚂蚁的 zipfileset 做这份工作

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</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>

如果你是一个 梅文 用户,通常是程序集插件执行您想要的操作,或者可能是阴影插件,在某些情况下是组合。

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

mvn assembly:assembly

或者,如果您有更特殊的事情需要处理,则可以选择其他目标之一。所有要包含的 JAR 文件均由 Maven 的依赖关系解析器获取。如果您使用阴影插件,它通常是安装目标的一部分,并且在我现在正在做的一个特定项目中我这样做

mvn install
mvn assembly:single

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

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

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

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

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

(基于安德里安的):

<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, ,并且它已经扩展并支持以下框架 春天吉斯, ,这可能会给其他方法带来麻烦。它还处理类加载器反转——其中一些 JAR 文件位于 One-JAR 外部(例如, 数据库连接 可能不捆绑发货的驱动程序)。

One-JAR 是命令行,带有 蚂蚁梅文 2 个插件。只需使用“jar”工具即可轻松构建。

我还可以推荐 Eclipse Jar Exporter (Runnable),Ference Hechler 在其上写道:他出色地提出了一种包装一组 JAR 文件的简单方法。他和我一起开发了 One-JAR,但 Jar Exporter 基于不同的代码库。

有一个工具叫 自动罐子 它将扫描您的字节码并使用它找到的类(包括引用(导入)的类)编译 .jar 文件。

不过,并不总是适用于像 Spring 这样的东西,您在配置中指定类名并由框架加载。

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

我认为你需要的工具是 罐子接头: http://ninjacave.com/jarsplice

确实如此 不是 需要 Ant 或 Maven,有自己的 GUI,使用起来很简单,并且完全按照您的要求进行 --> 它将多个 jar 文件的内容合并为一个文件 (请注意它仍然需要添加自己的类加载器)。

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

查看更多:

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

听上去像 阿帕奇蚂蚁 这就是您正在寻找的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top