如何在“war”任务中执行Ant路径映射?

3

我有几个JAR文件模式集,例如

<patternset id="common.jars">
 <include name="external/castor-1.1.jar" />
 <include name="external/commons-logging-1.2.6.jar" />
 <include name="external/itext-2.0.4.jar" />
     ...
</patternset>

我还有一个包含lib元素的“war”任务:

<lib dir="${src.dir}/jars">
  <patternset refid="common.jars"/>
  <patternset refid="web.jars"/>
     ...
</lib>

然而,按照此方法,我的WEB-INF/lib目录将包含来自模式的子目录:

WEB-INF/lib/external/castor-1.1.jar
WEB-INF/lib/external/...

有没有办法将JAR文件扁平化,使它们出现在WEB-INF/lib的顶层,而不管模式中指定的目录是什么?我查看了mapper,但似乎不能在lib内部使用它们。

2个回答

9

我不满意手动生成WAR目录或声明库子目录,所以我想出了这个方法。看起来很有效,显然你需要根据自己的需求进行调整:

<war destfile="build/output.war" webxml="${web.dir}/WEB-INF/web.xml">
    <fileset dir="${web.dir}" />
    <mappedresources>
        <fileset dir="${lib.dir}" includes="**/*.jar" />
        <chainedmapper>
            <flattenmapper/>
            <globmapper from="*.jar" to="WEB-INF/lib/*.jar" />
        </chainedmapper>
    </mappedresources>
</war>

3
没有<lib>元素可能有些不符直觉,但这是好的。需要重申一点,以防其他人不明白,<mappedresources>替代了<lib>。 war任务是jar/zip任务的扩展,而lib、classes、webinf和metainf元素都是FileSet,Ant会将它们放置在生成的war文件的相应位置。这种解决方案省略了<lib>元素,并“手动”将JAR包放置在WEB-INF/lib/目录下。 - spaaarky21

4
您可以尝试使用mappedresources元素(Ant 1.8+)来解决此问题。
<mappedresources>
  <!-- Fileset here -->
  <globmapper from="external/*.jar" to="*.jar"/>
</mappedresources>

如果你有一个典型的Web项目,最好将Web应用程序库和通用库分别放在不同的文件夹中,并将WEB-INF / lib保留只有运行时所需的内容。这样,你就可以避免冲突,而且其他开发人员也会更清楚地看到你的项目。关于这个话题的更多信息,请参考 http://ant.apache.org/manual/Types/resources.html#mappedresources

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接