如何将Ant路径转换为FileSet?

18

我正在编写一个Ant脚本,用于将项目打包成WAR文件。该软件由多个具有自己源目录、库等的项目组成。

WAR任务有一个嵌套元素lib,我目前正在处理它。我当前拥有所需库的引用作为Path(其中包含多个FileSets),我在类路径引用中使用它。然而,lib希望输入为FileSet,并且拒绝Path

我尝试将我的Path转换为FileSet,但是在其他地方作为类路径时似乎不起作用。

是否有一种方法可以将Path转换为FileSet?我不想复制粘贴目录。

<path id="compile.libs">
    <fileset dir="${common.path}/lib" includes="*.jar"/>
    <fileset dir="${data.path}/lib" includes="*.jar"/>
    <fileset dir="${gui.path}/lib" includes="*.jar"/>
    <fileset dir="${gui.path}/WebContent/WEB-INF/lib" includes="*.jar"/>
</path>

使用<war ..><../> <lib refid="compile.libs"/> </war>会导致以下错误:

BUILD FAILED
build.xml:173: compile.libs不表示zipfileset或fileset
4个回答

15

假设这些路径都是绝对路径,您可以先使用<pathconvert>Path转换为逗号分隔的列表,然后再将该列表转换回Fileset

<!-- create path -->
<path id="foo.path">
    <pathelement location="/foo/bar/baz.txt"/>
    <pathelement location="/qux/quux/quuux.txt"/>
</path>

<!-- convert foo.path to foo.list -->
<pathconvert 
    refid="foo.path" 
    property="foo.list"
    pathsep=","
    dirsep="/"
>
    <!-- 
        <fileset> will want relative paths, so we need to strip 
        the leading /. result: "foo/bar/baz.txt,qux/quux/quuux.txt"
    -->
    <map from="/" to=""/> 
</pathconvert>

<!-- convert foo.list to fileset -->
<fileset id="foo.fileset" dir="/" includes="${foo.list}"/>

(注意上述假设了Unix操作系统;如果您使用的是Windows操作系统或者想要实现跨平台,您可能需要对分隔符等进行微调。)


8
您有几个选择:
  1. 您可以在<war>任务中提供多个<lib>嵌套元素。也许这就足够了。
  2. 您可以将所有lib文件预先组装到一个临时目录中,然后只需引用该目录作为文件集。
  3. 有一个ant-contrib的PathToFileSet任务,但它需要一个中心根目录,而这可能不是您的compile.libs布局的情况。
  4. 自Ant 1.8.0以来,您可以使用mappedresources。来源:Ant脚本:防止javac-classpath war-lib中JAR重复
我认为我会尝试选项1。

5
我通过以下方式分阶段处理库来解决这个问题:
<copy todir="stage/libs" flatten="true">
<path refid="classpath" />
</copy>

然后在WAR任务中使用一个``简单地进行操作。

-1
编译时类路径中的JAR包与需要打包到WAR包中的JAR包不同。例如:我确定您需要使用servlet-api.jar来编译项目,但是您不需要将其置于WAR包中,因为容器已经提供了它。有些JAR包在编译时不需要,但在运行时需要。
我知道我没有回答您的问题,只是想让您考虑一下自己正在做什么。

虽然我意识到那个问题,但我很感激这些警告的话(为了后世)。如果能添加路径引用的排除项将会非常棒。如果需要的话,我准备好使用路径片段,然后将它们组合成一个更大的路径。 - Henrik Paul

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