是否可以组合两个jar文件,以便在applet标签中我可以简单地执行类似
的操作archive="jarjar.jar/jar1.jar"... ...archive="jarjar.jar/jar2.jar"... instead of
archive="jar1.jar"... ...archive="jar2.jar"...
我只需要一个jar文件,因此将两个jar文件放在一个文件夹中对我没用。
答案 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>