ANT:错过资源强制错误?

时间:2009-11-24 17:36:16

标签: ant resources detection

我继承了一个包含许多资源的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个文件。问题是我正在重新使用这个系统 常春藤用于依赖管理,并在此过程中的一些 引用现在指向不存在的文件。不幸的是,Ant确实如此 没有提供任何帮助找到这些坏指针。当这些资源 集合用于定义任何<include...>标记的类路径 指向丢失的文件会被默默忽略。

我以为我可以通过使用集合来强制错误 <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在资源指向时告诉我 丢失文件,最好是在资源定义时?

1 个答案:

答案 0 :(得分:4)

以下是一种方法的说明。要点

  • files转换为filelists - 这些文件可以包含文件系统中不存在的文件名,与文件集和文件不同,忽略不存在的条目
  • 使用restrict检查是否存在
  • 在缺少某些内容时使用fail错误

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

<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}" />

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