如何组合两个Jar文件

时间:2011-02-22 15:35:11

标签: java applet

是否可以组合两个jar文件,以便在applet标签中我可以简单地执行类似

的操作
archive="jarjar.jar/jar1.jar"...  ...archive="jarjar.jar/jar2.jar"... instead of
archive="jar1.jar"... ...archive="jar2.jar"...

我只需要一个jar文件,因此将两个jar文件放在一个文件夹中对我没用。

9 个答案:

答案 0 :(得分:67)

当然,只需提取两个jar文件并重新创建一个

$ mkdir tmp
$ (cd tmp; unzip -uo ../jar1.jar)
$ (cd tmp; unzip -uo ../jar2.jar)
$ jar -cvf combined.jar -C tmp .

tmp的东西确保将两个现有的jar提取到一个干净的目录中,然后从中创建新的。

请注意,您可能还需要合并其中包含的任何manifest.mf个文件,如果有文件命令中也包含“-m”选项。

答案 1 :(得分:8)

<击> 您需要提取两个JAR文件并重新生成一个。

jar -xvf jar1.jar tmp
jar -xvf jar2.jar tmp

cd tmp
jar -cvf jar3.jar .

<击>

请参阅the below answer

答案 2 :(得分:5)

将zipgroupfileset与Ant Zip task

一起使用
<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>

可能会帮助你。

答案 3 :(得分:2)

如果您使用的是gradle,只需将以下内容添加到build.gradle即可。无需插件。如果您需要特殊选项,那么请使用Fatjar插件,正如initialZero建议的那样。

task superSimpleJar(type: Jar) {
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it :     zipTree(it) } }
    with jar
}

对于Android项目,将其添加到app / build.gradle并运行&#34; gradlew superSimpleJar&#34;。在build / libs / app-all.jar中找到jar

task superSimpleJar(type: Jar) {
baseName = project.name + '-all'
from {

    configurations.compile.findAll {

    it.getName() != 'android.jar'

    }.collect {

    it.isDirectory() ? it : zipTree(it)

    }
 }
}

答案 4 :(得分:1)

只需解压缩两个jar文件,然后将结果压缩成一个zip文件,然后将其重命名为jar。

但正如adarshr所说:最好使用jar命令。

答案 5 :(得分:1)

还有eclipse fatjar插件。

答案 6 :(得分:1)

<?xml version="1.0" encoding="UTF-8"?>
<project name="zip-test" default="zip" basedir=".">

    <target name="zip">
        <zip destfile="out.jar">
            <zipgroupfileset dir="." includes="*.jar"/>
        </zip>
    </target>
</project>

将此代码保存在build.xml文件中,并将其保存在保存所有要合并的jar文件的文件夹中。打开cmd,提供文件夹路径并运行命令:ant zip

它将生成out.jar,它是所有罐子的组合。

答案 7 :(得分:0)

提取两个罐子并创建一个新的工作。 (使用上面显示的jar命令)。 关于清单文件的一个警告是,您要提取要在最后保留其清单文件的jar。

答案 8 :(得分:0)

我知道这是一个老问题,我只想加两分钱(尚无评论权限,因此可以创建一个新答案)。

我确实看到了sumanth.donthula的答案中的值,因为我们所有人合并jar的问题将是如何处理清单文件。就我而言,我想将一些库文件(主要是生成的Web服务客户端代码)合并到我编写的应用程序的jar中。可以用我自己的一个罐子替换清单。

最简单的方法是按顺序解压缩原始文件(如Alnitak和sumanth.donthula所述)。

我想使用zip ant任务(谢谢,ykombinator,这个想法)。事实证明,控制压缩/打包顺序的唯一方法是重命名文件。请在下面查看我的蚂蚁目标。

在我的示例中,输出目录称为codemodule.dir(我创建了FileNet代码模块)。其余名称是不言自明的。重要的步骤是将应用程序jar重命名为0 _...成为第一个。这样,当zip ant任务的重复属性设置为“ preserve”时,便会保留其清单。

<target name="merge_jars">
    <delete dir="${codemodule.dir}" quiet="true" />
    <mkdir dir="${codemodule.dir}" />
    <copy todir="${codemodule.dir}">
        <fileset dir="${lib.dir}" includes="*.jar"/>
        <fileset dir="${basedir}" includes="${app-name}.jar"/>
    </copy>
    <move file="${codemodule.dir}/${app-name}.jar" tofile="${codemodule.dir}/0_${app-name}.jar"/>
    <zip destfile="${codemodule.dir}/${app-name}-fat.jar" duplicate="preserve">
      <zipgroupfileset dir="${codemodule.dir}">
        <include name="*.jar"/>
      </zipgroupfileset>
    </zip>