我继承了一个包含许多资源的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在资源指向时告诉我 丢失文件,最好是在资源定义时?
答案 0 :(得分:4)
以下是一种方法的说明。要点
您需要将“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}" />
或者,您可以按照建议使用“复制”任务,但使用文件列表而不是文件。 当副本尝试处理不存在的第一个资源时,副本应该失败。