0

好的,我有App.jar一个可运行jar的应用程序。它依赖于更多的罐子,定义了应用程序的功能(例如worldwind.jar提供 3D 地球)。如何使其可运行的一种方法是在一个文件夹中提供所有 jar,并将其设置Class-PathMANIFEST.MF

Class-Path: .

但是,我更愿意将所有罐子合并为一个。那可能吗?

4

3 回答 3

1

原始答案:作为 jar es 基本上是一个 zip 文件,只需打开您想要的所有 jar 并复制目标 jar 中的类。但是,今天我们通常让 maven 之类的工具来处理依赖关系

于 2013-05-30T12:41:13.657 回答
0

是的。我正是为此使用了Maven 阴影插件

mvn clean package shade:shade
于 2013-05-30T12:47:47.770 回答
0

是的。

如果您使用的是 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 文件。

于 2013-05-30T12:40:59.620 回答