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

时间:2015-10-26 12:07:04

标签: 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从路径中剥离后是否有任何形式的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 个答案:

答案 0 :(得分:2)

考虑使用包含<mappedresources><chainedmapper>。反过来,链式映射器包含<flattenmapper>后跟<globmapper> ...

<mappedresources>

<lib>替换<war>任务中的<flattenmapper>

<fileset><globmapper>中的文件路径中删除目录。 <mappedresources>将目录添加回来。

(?!^side$)\b.+\b 至少需要Ant 1.8。