将版本合并到一个 JAR 文件的最简单方法
-
09-06-2019 - |
题
有没有一个工具或脚本可以轻松合并一堆 罐 文件合并到一个 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
听上去像 阿帕奇蚂蚁 这就是您正在寻找的。