1

我继承了一个 Ant 构建系统,其中包含许多资源集定义,如下所示:

<files id="app1.lib.jars">
  <include name="${java}/jre/lib/jsse.jar"/>
  <include name="${work.lib}/jtidy.jar"/>
  ...
</files>

<files id="app2.lib.jars">
  <include name="${work.lib}/itext.jar"/>
  <include name="${work.lib}/commons-httpclient.jar"/>
  ...
</files>

<files id="app3.lib.jars">
  <include name="${work.lib}/jdom.jar"/>
  <include name="${ant.lib}/ant.jar"/>
  ...
</files>

其中可能有十几个,每个可以包含 5 到 50 个文件。问题是我正在改造这个系统以使用 Ivy 进行依赖管理,并且在此过程中,一些引用现在指向不存在的文件。不幸的是,Ant 没有提供任何帮助来查找这些坏指针。当这些资源集合用于定义类路径时,任何<include...>指向丢失文件的标记都会被忽略。

我认为我可以通过使用集合作为 a 的来源来强制出错<copy...>,但即使使用failonerror="true"它也只是忽略了错误的引用。

命令行-v(详细)和-d(调试)选项也没有帮助。输出承认有些丢失但实际上并没有显示出来

 [echo] app1.lib.jars
 [copy] C:\dev\src\tomcat6\work\java\jre\lib\jsse.jar omitted as C:\dev\src\tomcat6\work\verify\jsse.jar is up to date.
 [copy] C:\dev\src\tomcat6\work\lib\axis-ant.jar omitted as C:\dev\src\tomcat6\work\verify\axis-ant.jar is up to date.
 ...
 [copy] No sources found.
 [echo] app2.lib.jars
 ...

对于一次性解决方案,我从 Ant 文件中的资源集中提取所有文件名,并将其与在适当排序后将所有文件(在 Ant 中)复制到临时目录中的结果的目录列表进行比较。

问题:有没有办法让 Ant 在资源指向丢失的文件时告诉我,最好是在定义资源时告诉我?

4

1 回答 1

4

这是一种方法的说明。关键点

  • 将您的文件转换files文件列表- 这些可以包含文件系统中不存在的文件的名称,与文件集和文件不同,它们会忽略不存在的条目
  • 使用限制检查是否存在
  • 缺少某些内容时使用failto 错误

您需要将“antlib:org.apache.tools.ant.types.resources.selectors”命名空间添加到项目中以使用如下所示的资源选择器。您会遇到低于 1.7.0 的 Ant 版本的问题。

<project name="so" default="checkfiles" basedir="."
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">

<filelist id="app1.lib.jars">
  <file name="${java}/jre/lib/jsse.jar"/>
  <file name="${work.lib}/jtidy.jar"/>
  ...
</filelist>

<restrict id="missing.app1.lib.jars">
  <filelist refid="app1.lib.jars"/>
  <rsel:not>
    <rsel:exists/>
  </rsel:not>
</restrict>

<property name="missing.files" refid="missing.app1.lib.jars" />
<fail message="These files are missing: ${missing.files}">
  <condition>
    <length string="${missing.files}" when="greater" length="0" />
  </condition>
</fail>
<pathconvert property="found.files" refid="app1.lib.jars" />
<echo message="Found files ${found.files}" />

或者,您可以按照您的建议使用“复制”任务,但使用文件列表而不是文件。当尝试处理不存在的第一个资源时,副本应该会失败。

于 2009-11-25T00:06:51.013 回答