2015-10-26 35 views
2

我必須從ANT腳本構建WAR文件。我已經聲明fileset與由任意庫組成的編譯類路徑(在下面的例子中,它們只有2個。在我的真實情況下,最多爲90)。我希望在戰爭中包含相同集合的庫,而不必在兩個地方聲明它們全部:在<javac><war>任務內。如何使用ANT構建WAR,包括任意的自定義類路徑

這是我的Ant腳本:

<project name="war-with-custom-classpath" basedir="."> 

    <property environment="env" /> 
    <property name="lib" location="${env.USERPROFILE}/.m2/repository" /> 
    <fileset id="my.classpath" dir="${lib}"> 
     <include name="commons-pool/commons-pool/1.5.6/commons-pool-1.5.6.jar" /> 
     <include name="commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar" /> 
    </fileset> 

    <target name="compile"> 
     <javac srcdir="src/test/java" classpathref="my.classpath"> 
     </javac> 
    </target> 

    <target name="war"> 
     <delete file="mywar.war" /> 
     <war destfile="mywar.war" needxmlfile="false"> 
      <lib refid="my.classpath"> 
      </lib> 
     </war> 
     <!--Read the created war to see its contents--> 
     <exec command="jar ft mywar.war"> 
     </exec> 
    </target> 

</project> 

...但altough庫被納入最後的戰爭,他們保留其原始路徑這樣的:

META-INF/ 
META-INF/MANIFEST.MF 
WEB-INF/ 
WEB-INF/lib/ 
WEB-INF/lib/commons-logging/ 
WEB-INF/lib/commons-logging/commons-logging/ 
WEB-INF/lib/commons-logging/commons-logging/1.1.1/ 
WEB-INF/lib/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar 
WEB-INF/lib/commons-pool/ 
WEB-INF/lib/commons-pool/commons-pool/ 
WEB-INF/lib/commons-pool/commons-pool/1.5.6/ 
WEB-INF/lib/commons-pool/commons-pool/1.5.6/commons-pool-1.5.6.jar 

有任何形式的JAR在將其從路徑上剝離後包括在內?就像這樣:

META-INF/ 
META-INF/MANIFEST.MF 
WEB-INF/ 
WEB-INF/lib/ 
WEB-INF/lib/commons-logging-1.1.1.jar 
WEB-INF/lib/commons-pool-1.5.6.jar 

我已經嘗試過:

<lib refid="my.classpath" prefix="/WEB-INF/lib"/> 

...但結果還是一樣。

我也試過:

<lib refid="my.classpath" fullpath="WEB-INF/lib"/> 

<lib refid="my.classpath" fullpath="/WEB-INF/lib"/> 

...它打開錯誤Cannot set both fullpath and prefix attributes

而且我也試過:

<zipfileset refid="my.classpath" fullpath="WEB-INF/lib" /> 

...但它開啓錯誤fullpath attribute may only be specified for filesets that specify a single file.

而且我還研究在Ant Manual和SO,但沒有運氣這麼遠。

回答

1

考慮使用包含<chainedmapper><mappedresources>。鏈映射器,又包含一個<flattenmapper>後跟一個<globmapper> ...

<war destfile="mywar.war" needxmlfile="false"> 
    <mappedresources> 
     <fileset refid="my.classpath" /> 
     <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*.jar" to="WEB-INF/lib/*.jar" /> 
     </chainedmapper> 
    </mappedresources> 
</war> 

<mappedresources><war>任務取代<lib>

<flattenmapper><fileset>的文件路徑中剝離目錄。 <globmapper>將目錄返回。

<mappedresources>至少需要Ant 1.8。

+0

男人,這就是爲什麼我喜歡SO。有效。非常感謝! –