2009-11-30 124 views
57

我使用Ant來構建一些Java項目。
在某些情況下,我在JAR文件的表單中有一個包含外部依賴關係的lib/目錄。用螞蟻創建捆綁包jar

在構建,我創建了一個捆綁的罐子,包含項目的代碼,依賴一起,加入到包JAR文件中的每個lib/目錄罐子的zipfileset

問題是,每當我添加一個jar或更改名稱時,我都需要記住更新build.xml文件,因爲我找不到以自動方式添加這些zipfilesets的方法,其中包括所有罐子在一定的模式(例如lib/*.jar)。

有沒有更好的方法來做到這一點?

我已經考慮爲此編寫我自己的Ant任務,或者使用Groovy的ant API以編程方式執行此操作,但想知道是否有使用「vanilla」ant的方法。

回答

50

在我的目標,我有這樣的事情:

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> 
    <zipgroupfileset dir="dist" includes="*.jar"/> 
    <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/> 

    <manifest> 
     <attribute name="Main-Class" value="${main.class}"/> 
     <attribute name="Class-Path" value="${mf.classpath}"/> 
    </manifest> 
</jar> 

,這裏是我如何建立我的類路徑:

<path id="build.classpath"> 
    <fileset dir="${basedir}/"> 
     <include name="${lib.dir}/*.jar"/> 
    </fileset> 
</path> 

<pathconvert property="mf.classpath" pathsep=" "> 
    <path refid="build.classpath"/> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*.jar" to="lib/*.jar"/> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

mf.classpath從張貼的包目標使用以上。 這部分我從其他地方複製過,所以我並不是那麼熟悉它。

快速編輯。 Java3c需要了解這些罐子。

<path id="jars"> 
    <fileset dir="${lib.dir}" includes="**/*.jar"/> 
</path> 

<target name="compile"> 
    <mkdir dir="${build.dir}"/> 
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/> 
</target> 
+1

下面是一個類似於jonescb的方法,它包含最終的'build.xml'(大圖),這個答案中缺少這個方法:http://www.mkyong.com/ant/ant-create-a-fat-jar文件/ – Stephan

0

下面是一個ant目標的簡單示例,它將創建一個jar包(名爲test.jar),該jar包含lib目錄下的所有jar文件。也許這會解決你的問題?

<target name="jar"> 
    <jar destfile="test.jar"> 
     <fileset dir="lib/" includes="**/*.jar" /> 
    </jar> 
</target> 
+1

罐子文件是否可以嵌套?你確定這會起作用嗎? – abyx

+0

嗯,我想不是,我在想戰爭和webapps而不是罐子,對不起'回合。 – Upgradingdave

29

使用zipgroupfileset。例如:

<target name="jar"> 
    <jar destfile="foo.jar" basedir="${dir.classes}"> 
     <zipgroupfileset dir="lib" includes="*.jar"/> 
    </jar> 
</target> 

zipgroupfileset是記錄與Zip任務。

+0

正如jonescb回答,那真的是解決方案。從來沒有看到它,因爲它隱藏在Zip任務 – abyx

+0

這個問題的最大問題是jar文件是否有額外的文件,通常在MANIFEST目錄中。例如,許多spring框架jar包含spring.handlers,spring.schemas和spring.tooling文件..好吧,我還沒有想過如何處理這些..合併? – ticktock

+1

@GeorgeBaxter一直在尋找相同的東西,並最終做[this](http://stackoverflow.com/a/24083318/2208271)。讓我知道你是否找到更好的解決方案。 – Sithsu

6

對於那些你使用NetBeans在這裏的是如何創建與庫JAR檔案使用zipgroupfileset捆綁:

<target name="-post-jar"> 

    <property name="store.jar.name" value="MyJarName"/> 

    <property name="store.dir" value="dist"/> 
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/> 

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/> 

    <jar destfile="${store.dir}/temp_final.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="${store.jar}"> 
     <zipfileset src="${store.dir}/temp_final.jar" 
     excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/> 
    </zip> 

    <delete file="${store.dir}/temp_final.jar"/> 
    <delete dir="${store.dir}/lib"/> 
    <delete file="${store.dir}/README.TXT"/> 
</target> 

我已經添加了這個目標定義build.xml文件的末尾。目標名稱是-post-jar。