如何将联合传递给 war lib 元素?

How can I pass a union to the war lib element?

我正在尝试重构 ant build.xml 文件以减少重复。以前该文件有一堆像这样的目标:

<war ...>
    <lib dir=${lib}">
        <include name="foo.jar"/>
        <include name="bar.jar"/>
        <include name="qux.jar"/>
    </lib>
    ...
</war>

<jar ...>
    ...
    <manifest>
        <attribute name="Class-Path" value="foo.jar bar.jar baz.jar"/>
    </manifest>
</jar>

尽管有 ant 文档,我还是把它看成这样:

<fileset id="commonLibs1" dir="${lib}">
    <include name="foo.jar"/>
    <include name="bar.jar"/>
</fileset>

<union id="clientLibs">
    <fileset refid="commonLibs1"/>
    <fileset dir="${lib}">
        <include name="baz.jar"/>
    </fileset>
</union>

<war ...>
    <lib dir=${lib}">
        <include name="foo.jar"/>
        <include name="bar.jar"/>
        <include name="qux.jar"/>
    </lib>
    ...
</war>

<manifestclasspath property="tmpClassPath" jarfile="./placeholdername.jar">
    <classpath>
        <resources refid="clientLibs"/>
    </classpath>
</classpath>

<jar ...>
    ...
    <manifest>
        <attribute name="Class-Path" value="${tmpClasspath}"/>
    </manifest>
</jar>

膨胀。现在我几乎达到了我的目标,即不将所有这些 jar 名称复制到各处:

    <fileset id="commonLibs1" dir="${lib}">
    <include name="foo.jar"/>
    <include name="bar.jar"/>
</fileset>

<union id="clientLibs">
    <fileset refid="commonLibs1"/>
    <fileset dir="${lib}">
        <include name="baz.jar"/>
    </fileset>
</union>

<union id="serverLibs">
    <fileset refid="commonLibs1"/>
    <fileset dir="${lib}">
        <include name="qux.jar"/>
    </fileset>
</union>

<war ...>
    <lib refid="serverLibs"/>
    ...
</war>

<manifestclasspath property="tmpClassPath" jarfile="./placeholdername.jar">
    <classpath>
        <resources refid="clientLibs"/>
    </classpath>
</classpath>

<jar ...>
    ...
    <manifest>
        <attribute name="Class-Path" value="${tmpClasspath}"/>
    </manifest>
</jar>

但是:

build.xml:1067: serverLibs doesn't denote a zipfileset or a fileset

有什么方法可以实现吗?

warlib 嵌套元素只接受 filesetzipfileset。不支持 union 等其他资源集合。您可能有几种方法可以将其转换为 fileset。如果 union 需要保留在其他地方使用,那么您可以从中创建一个 path 元素并使用 Ant-Contrib pathtofileset 任务将其转换为 fileset:

<union id="serverLibs">
    <fileset refid="commonLibs1"/>
    <fileset dir="${lib}">
        <include name="qux.jar"/>
    </fileset>
</union>

<path id="serverLibsPath">
    <resources refid="serverLibs" />
</path>

<pathtofileset pathrefid="serverLibsPath" name="serverLibsFileset" dir="${lib}" />

<war ...>
   <lib refid="serverLibsFileset"/>
   ...
</war>

或者您可以跳过 Ant-Contrib 并使用 mappedresources with the path created above (see this post 作为示例)。

一个更简单的方法(如果 union 仅被 war 任务使用)是删除并集并仅在多个 lib 元素中指定文件集的组合:

<war ...>
   <lib refid="commonLibs1"/>
   <lib dir="${lib}">
       <include name="qux.jar"/>
   </lib>
   ...
</war>