開發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檔反編譯之後不易閱讀,可以參考這篇