it-swarm.cn

将发布合并到一个JAR文件的最简单方法

是否有一个工具或脚本可以轻松地将一堆 _ jar _ files合并到一个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有点破,所以我会去解决它。 Mavenpom.xml文件显然也被破坏了,所以我必须在修复jrst之前解决这个问题...我觉得这是一个bug-magnet :-)


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

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

70
tovare

Eclipse 3.4 JDT的Runnable JAR导出向导。

在Eclipse 3.5中,这已得到扩展。现在,您可以选择处理引用的JAR文件的方式。

33
Stephen Denne

Ant的zipfileset完成了这项工作

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
62
akuhn

在尝试了几个不同的解决方案后,我发现 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>
27
Ashley Mercer

如果您是 Maven user,通常Assembly程序插件可以执行您想要的操作,或者可能使用shade插件,在某些情况下可以组合使用。

使用Assembly插件,您可以在项目中放置一个包含任何必要设置的清单文件,尽管默认设置通常非常好。然后建造完成

mvn Assembly:assembly

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

mvn install
mvn Assembly:single

Assembly:single目标是解决生命周期问题,在本例中是 Spring application。

14
larsivi

您可以使用 JarJar 将使用包镜像来确保您的JAR文件不与其他文件冲突。

8
Steve g

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

我实际上用JRST工具尝试过ProGuard,就像你报道的那样。我试图追踪问题并发现它与 jrst引用的ICU4J库中的错误 相关。问题是,使用的ICU版本现在已经过时了。所以我用ICU4J版本3.2替换了icu.jar文件。现在,ProGuard发现了一系列关于JRST库的紧急情况的错误/警告。

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

8
jrudolph

(基于安德里安的):

<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>
7
象嘉道

One-JAR 0.97刚刚发布在 http://one-jar.sourceforge.net ,并且它已经扩展,支持 SpringGuice 等框架。给其他方法带来麻烦。它还处理classloader-inversion - 其中一些JAR文件在One-JAR外部(例如, _ jdbc _ drivers可能不捆绑)。

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

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

5
simontuffs

或者使用Maven Assembly插件(mvn Assembly:assembly)

3
Philip Helger

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

但是,并不总是使用类似Spring的东西,在配置中指定类名并由框架加载。

3
user7094

我认为你需要的工具是 JarSplice http://ninjacave.com/jarsplice

它确实需要Ant或Maven,有自己的GUI,它很容易使用并完全按照你的要求 - >它将几个jar文件的内容合并为一个一个(请注​​意它仍然需要添加自己的类加载器)。

2
Nadir

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

看更多:

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

0
hoang