我有一个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>
我想将它们汇总到一个更容易保持更新的列表中。
但我被阻止,因为我不知道如何与类似文件集的结构共享类似路径的结构。
答案 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>