開發Java程式專案時,免不了要使用到別人提供的開源函式庫(Library),或是要切成好幾份小專案來做,最後再整合到一個大專案內。如果是使用Netbeans這個IDE工具,在建置Jar的過程中,會將不是目前建置專案的外部引用專案、Jar函式庫,另外分別建置出jar檔,再擺放到dist的lib資料夾內。因此,建置出來的主要jar檔案,就必須依賴這個lib資料夾裡的所有jar檔,才能正常使用。這樣的作法對於某些需要時常傳播的jar檔來說十分不方便,只要整個專案一有修改,就必須將有更動到的jar,或是所有的jar,一同發佈出去。若是打從一開始就只有一個jar檔,那麼就可以不必這麼麻煩。為了讓Netbeans自動整合這些Jar檔,並產生出單個Jar檔,必須在build script上動手腳才行。
在每個Netbeans專案根目錄底下,均有一個build.xml,只要在build.xml內的文字的最下方,</project>的上面,加上以下文字,Netbeans在建置專案的時候,就會在專案根目錄中產生出一個已經將所有Jar都包好的單個Jar檔案。若是JavaFX的Application專案的話,要把以下的「-post-jar」target name改成「-post-jfx-jar」。
<target name="-magic-post">
<condition property="檔名" value="${application.title}" else="${ant.project.name}">
<isset property="application.title"/>
</condition>
<property name="路徑" value="${basedir}/${檔名}.jar"/>
<property name="版權" value="magiclen.org"/>
<property name="暫存" value="./temp_jars.jar"/>
<condition property="主類別" value="${javafx.main.class}" else="${main.class}">
<isset property="javafx.main.class"/>
</condition>
<delete file="${暫存}"/>
<delete file="${路徑}"/>
<jar destfile="${暫存}" filesetmanifest="skip">
<zipgroupfileset dir="${dist.dir}" includes="*.jar"/>
<zipgroupfileset dir="${dist.dir}/lib" includes="*.jar" erroronmissingdir="false"/>
<manifest>
<attribute name="Main-Class" value="${主類別}"/>
<attribute name="Copyright" value="${版權}"/>
</manifest>
</jar>
<zip destfile="${路徑}">
<!--用來移除Jar檔案內原本的簽名-->
<zipfileset src="${暫存}" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<delete file="${暫存}"/>
<echo message="Jar路徑:${路徑}"/>
</target>
<target name="-post-jar" depends="-magic-post" />
如果要混淆程式碼,使Jar檔反編譯之後不易閱讀,可以參考這篇。