将发布合并到一个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之前我必须先修复它……我感觉就像是个磁铁的错误:-)
更新:我从来没有修正过这个应用程序,但是我签出了基于胖JAR的Eclipse的" Runnable JAR导出向导"。我发现这很容易用于部署自己的代码。
其他一些出色的建议对于在非Eclipse环境中进行构建可能会更好,oss可能应该使用Ant进行良好的构建。 (到目前为止,Maven只是给我带来了痛苦,但其他人还是喜欢它。)
解决方案
回答
如果我们是Maven用户,则通常程序集插件会执行我们想要的操作,或者可能是阴影插件,并且在某些情况下是组合。
使用Assembly插件,我们可以将清单文件带有任何必要的设置放入项目中,尽管默认值通常很好。然后完成构建
mvn assembly:assembly
或者,如果我们还有其他需要处理的特殊事项,则可以选择其他目标之一。所有要包含的JAR文件都由Maven的依赖解析器获取。如果我们使用shade插件,它通常是安装目标的一部分,在一个特定的项目中,我现在要做的是
mvn install mvn assembly:single
" assembly:single"的目标是解决生命周期问题,在这种情况下,是在Spring应用程序中。
回答
听起来像Apache Ant是我们要找的东西。
回答
有一个名为autojar的工具,它将扫描字节码并使用找到的类(包括引用的(导入的)类)编译.jar文件。
但是,并非总是与Spring之类的东西一起使用,在Spring中,我们可以在配置中指定类名,然后由框架加载它。
回答
Eclipse 3.4 JDT的Runnable JAR导出向导。
在Eclipse 3.5中,已对此进行了扩展。现在,我们可以选择要如何处理引用的JAR文件。
回答
尝试了几种不同的解决方案后,我发现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。有一个自定义的"单罐"蚂蚁任务,其工作方式如下(假设清单被称为" 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>
回答
ProGuard不仅将JAR文件打包到一个文件中,而且还可以优化,清理或者模糊化类文件,使生成的JAR文件比以前所有JAR文件的总和小得多。
我实际上是使用JRST工具尝试过ProGuard的,正如我们所报告的那样。我试图找出问题所在,并发现它与jrst引用的ICU4J库中的错误有关。问题是,使用的ICU版本现在已经过时了。因此,我将Icu.jar文件替换为ICU4J 3.2版。现在,ProGuard可以通过JRST库找到许多其他有关不兼容的错误/警告。
我的猜测是ProGuard可以按预期工作,但是jrst的库并不统一。除了与开发人员交谈之外,我不知道我们能做更多的事情,因为他们应该检查并更新项目的依赖关系。
回答
或者使用Maven程序集插件(mvn assembly:assembly)
回答
我们可以使用JarJar,它将使用包阴影来确保JAR文件不会与其他文件冲突。
回答
Ant的zipfileset
可以胜任
<jar id="files" jarfile="all.jar"> <zipfileset src="first.jar" includes="**/*.java **/*.class"/> <zipfileset src="second.jar" includes="**/*.java **/*.class"/> </jar>
回答
One-JAR 0.97刚刚在http://one-jar.sourceforge.net上发布,并且已经扩展了对Spring和Guice等框架的支持,这可能给其他方法带来麻烦。它还处理classloader-inversion-其中一些JAR文件在One-JAR外部(例如,可能未捆绑提供的JDBC驱动程序)。
One-JAR是命令行,带有Ant和Maven 2插件。仅使用" jar"工具进行构建也很简单。
我还可以推荐Ference Hechler在上面写的Eclipse Jar Exporter(Runnable):他在提出一种简单的包装一组JAR文件的方法方面做得很好。他和我从事One-JAR的开发,但Jar导出器基于不同的代码库。