如何使用ANT构建WAR,包括任意自定义类路径



我必须从ANT脚本构建WAR文件。我声明了一个fileset,其编译类路径由任意库组成(在下面的示例中,它们只有2个)。在我的实际情况中,高达90)。我想在战争中包括相同的库集合,而不必在两个地方声明它们:在<javac><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>

…但是,尽管库被包含在最后的战争中,它们保留了它们的原始路径,如下所示:

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.

我也研究了蚂蚁手册和SO,但到目前为止还没有找到

考虑使用包含<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.

最新更新