好吧,我有App.jar
作爲我的應用程序的可運行jar
。它依賴於更多的罐子,定義應用程序的功能(例如提供3D球體的worldwind.jar
)。一種方法如何使其可以運行是提供一個文件夾中所有的罐子設置MANIFEST.MF
的Class-Path
爲:如何將兩個和多個JAR「合併」爲一個?
Class-Path: .
我會,但是願意,所有的罐子合併成一個。那可能嗎?
好吧,我有App.jar
作爲我的應用程序的可運行jar
。它依賴於更多的罐子,定義應用程序的功能(例如提供3D球體的worldwind.jar
)。一種方法如何使其可以運行是提供一個文件夾中所有的罐子設置MANIFEST.MF
的Class-Path
爲:如何將兩個和多個JAR「合併」爲一個?
Class-Path: .
我會,但是願意,所有的罐子合併成一個。那可能嗎?
是的。
我有一個Ant的簡單例子,如果您使用的是NetBeans:在項目的build.xml中,添加這個目標並根據需要修改命名。
這將合併您的「dist/lib」文件夾中的所有jar和項目的輸出jar,並將它們放在「merged」文件夾中。
你可以很容易地適應你的需要。
然後,您只需要右鍵單擊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)甚至手動,因爲罐子基本上是zip文件。
原始回答:因爲jar基本上是一個zip文件,只需打開所需的所有jar文件並將其複製到目標jar中。然而,今天我們通常讓像maven這樣的工具來照顧依賴關係
是的。我正好使用Maven shade plugin。
mvn clean package shade:shade
如果它不需要太多的工作,你可能會考慮使用Maven來構建你的項目。我相信它會爲你處理這一切。否則,我一直認爲這是一個漫長而容易出錯的過程。 – DaveH