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

时间:2010-05-10 12:46:47

标签: java ant

我有几个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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:4)

您可以尝试使用mappedresources元素(Ant 1.8+)

<mappedresources>
  <!-- Fileset here -->
  <globmapper from="external/*.jar" to="*.jar"/>
</mappedresources>

http://ant.apache.org/manual/Types/resources.html#mappedresources

如果您有一个典型的Web项目,最好将Web应用程序库和通用库拆分到不同的文件夹中,并使WEB-INF / lib只包含运行时所需的那些。通过这种方式,您可以避免冲突,并且您的项目对其他开发人员来说也会更加清晰。