Ant脚本:防止在javac-classpath war-lib中重复JAR

时间:2011-02-18 09:18:11

标签: ant war

我有一个ANT脚本,我有很多重复路径到相同的集JAR文件。 但是在类路径和战争元素中有太多双重措辞。

<path id="my.classpath">
  <pathelement location="folderA/subFolderA/1.0/A.jar"/>
  <pathelement location="folderC/subFolderB/1.0/B.jar"/>
  <pathelement location="folderF/subFolderZ/2.0/Z.jar"/>
  <pathelement location="compile/subFolderX/1.0/onlyForJavac.jar"/>
</path>
....
<javac ...>
 <classpath refid="my.classpath" />
</javac>
....
<war ...>
 <lib file="folderA/subFolderA/1.0/A.jar"/>
 <lib file="folderC/subFolderB/1.0/B.jar"/>
 <lib file="folderF/subFolderZ/2.0/Z.jar"/>
 <lib file="moreFolderF/subFolderZ/2.0/additionFile.jar"/>
 <lib file="moreFolderF/subFolderZ/2.0/additionRuntimeFile.jar"/>
</war>

我想将它们汇总到一个更容易保持更新的列表中。

但我被阻止,因为我不知道如何与类似文件集的结构共享类似路径的结构。

2 个答案:

答案 0 :(得分:12)

自Ant 1.8.0以来,有一个新的资源集合 - mappedresources 可用于代替war任务lib元素。

因此,任务可能看起来像这样(几乎直接来自文档):

<war ... >
    <mappedresources>
        <restrict>
           <path refid="my.classpath"/>
           <type type="file"/>
        </restrict>
        <chainedmapper>
          <flattenmapper/>
          <globmapper from="*" to="WEB-INF/lib/*"/>
        </chainedmapper>
    </mappedresources>
</war>

添加了此功能以解析long-standing feature request 在部署到WEB-INF/lib时,任务会展平jar。

上一个回答:

虽然您无法使用vanilla Ant轻松地将路径转换为文件集,但您可以采用其他方式。 因此,一种选择是在文件集中定义jar,并从中派生路径。 也许是这样的事情:

<fileset id="my.fileset" dir="${basedir}">
    <include name="folderA/subFolderA/1.0/A.jar"/>
    <include name="folderC/subFolderB/1.0/B.jar"/>
    <include name="folderF/subFolderZ/2.0/Z.jar"/>
    <include name="moreFolderF/subFolderZ/2.0/additionFile.jar"/>
    <include name="moreFolderF/subFolderZ/2.0/additionRuntimeFile.jar"/>
</fileset>

<path id="my.classpath">
    <fileset refid="my.fileset" />
</path>

<!-- javac stays the same -->

<war ...>
    <lib refid="my.fileset" />
</war>

另一种可能性是使用ant-contrib pathtofileset task

答案 1 :(得分:0)

另一种解决方案,可能是“不是最好的”,将所需的jar文件放在WEB-INF / lib中,然后从那里设置类路径。

<path id="compile.classpath">
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

当构建战争的时候,你根本不用担心<lib>,因为jar已经放在WEB-INF / lib文件夹中。

<war destfile="${dist.dir}/${project.name}.war" webxml="${web.dir}/WEB-INF/web.xml">
        <fileset dir="${web.dir}"/>
        <classes dir="${build.dir}/classes"/>
    </war>