2009-11-24 121 views
1

我继承包含很多这样的资源 集定义Ant构建系统: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进行依赖关系管理,并且在此过程中,一些 引用现在指向不存在的文件。不幸的是,蚂蚁 没有提供任何帮助找到这些坏指针。当使用这些资源 集合来定义类路径时,任何<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在资源指向 指向缺少的文件时告诉我,最好是在定义资源时?

回答

4

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

  • 将您filesfilelists - 这些可以包含文件的名称是不会在文件系统中存在,不像文件集和文件,即忽略条目不存在
  • 使用restrict到检查是否存在
  • 使用fail时缺少的东西

错误您需要将增加“的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}" /> 

或者,您可以使用'copy'任务,正如您所建议的那样,但使​​用文件列表而不是文件。 当它试图处理不存在的第一个资源时,副本应该失败。

+0

+1看起来很有趣。我明天会试试这个。 – 2009-11-25 03:11:46

+0

这个解决方案并不是最优的,因为我更喜欢使用新的资源容器(我发现很奇怪文件列表和文件集没有被重构为子容器的子类)。我真正想要的是一个选项,它会告诉Ant为缺少的文件发出警告,但看起来不可用。马丁的回答看起来像是暂时完成这一任务的最佳方式。 – 2009-11-29 02:22:03