好的,我有App.jar
一个可运行jar
的应用程序。它依赖于更多的罐子,定义了应用程序的功能(例如worldwind.jar
提供 3D 地球)。如何使其可运行的一种方法是在一个文件夹中提供所有 jar,并将其设置Class-Path
为MANIFEST.MF
:
Class-Path: .
但是,我更愿意将所有罐子合并为一个。那可能吗?
好的,我有App.jar
一个可运行jar
的应用程序。它依赖于更多的罐子,定义了应用程序的功能(例如worldwind.jar
提供 3D 地球)。如何使其可运行的一种方法是在一个文件夹中提供所有 jar,并将其设置Class-Path
为MANIFEST.MF
:
Class-Path: .
但是,我更愿意将所有罐子合并为一个。那可能吗?
原始答案:作为 jar es 基本上是一个 zip 文件,只需打开您想要的所有 jar 并复制目标 jar 中的类。但是,今天我们通常让 maven 之类的工具来处理依赖关系
是的。我正是为此使用了Maven 阴影插件。
mvn clean package shade:shade
是的。
如果您使用的是 NetBeans,我在这里有一个关于 Ant 的快速示例:在项目的 build.xml 中,添加此目标并根据需要修改命名。
这会将“dist/lib”文件夹中的所有 jar 与项目的输出 jar 合并,并将它们放在“合并”文件夹中。
您可以轻松地调整它以满足您的需要。
然后只需要右键build.xml文件,“运行目标”,“其他目标”,点击“合并”。
<target name="merged" depends="jar">
<property name="name" value="yourMergedJar"/>
<property name="dir" value="merged"/>
<property name="jar" value="${dir}/${name}.jar"/>
<echo message="Packaging ${application.title} into a single JAR at ${jar}"/>
<delete dir="${dir}"/>
<mkdir dir="${dir}"/>
<jar destfile="${dir}/temp.jar" filesetmanifest="skip">
<zipgroupfileset dir="dist" includes="*.jar"/>
<zipgroupfileset dir="dist/lib" includes="*.jar"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<zip destfile="${jar}">
<zipfileset src="${dir}/temp.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<delete file="${dir}/temp.jar"/>
</target>
编辑
正如其他成员所说,您可以在任何 IDE(使用 Ant 或 Maven)中甚至手动执行此操作,因为 jar 基本上是 zip 文件。