我必须从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.