题
我从 ant 构建文件中得到了非常令人困惑的反应,我想知道是否我不够聪明,或者这实际上可能是一个错误。
我在我的项目中全局设置了以下属性:
<property name="lib.dir" location="lib"/>
然后我将尝试通过文件集(多个资源)将此目录中的一些文件添加到 jar 文件中:
<fileset dir="${basedir}" includes="lib/*filename*"/>
应该有(并且存在)3 个不同的库,它们以这种方式匹配。但是,如果我尝试使用以下命令,它不起作用并且不包含任何文件:
<fileset dir="${basedir}" includes="${lib.dir}/*filename*"/>
请注意,唯一的区别在于全局属性的使用。现在简单的问题:为什么第一个版本可以像宣传的那样工作,但第二个版本却不能?
解决方案
请在使用“fileset”表达式的任务之前或之后检查“lib.dir”的实际值。只是为了确保在全局设置后它没有被意外更改。这 <echo/>
任务可以提供帮助。
也许我找到了解决方案。的描述 location
属性是:
将属性设置为给定文件的绝对文件名。如果此属性的值是绝对路径,则保持不变(将 / 和 \ 字符转换为当前平台约定)。否则,它将被视为相对于项目的 basedir 的路径并进行扩展。
只需使用 value
属性而不是 location
. 。这是一个测试脚本来显示差异:
<project name="test">
<property name="test1" location="lib"></property>
<property name="test2" value="lib"></property>
<target name="target" description="description">
<echo>${test1}</echo>
<echo>${test2}</echo>
</target>
</project>
我的系统上的输出如下:
Buildfile: D:\Develop\workspace-jabber\scrapbook\build.xml
target:
[echo] D:\Develop\workspace-jabber\scrapbook\lib
[echo] lib
BUILD SUCCESSFUL
Total time: 307 milliseconds
其他提示
我已经找到了一个线索,但不是整个事情。
我与ant -debug的两个版本都判断,这里是偶然的。
在工作中,不使用 - 属性版本,我得到以下输出:
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [lib/*filename*] excludes: [] }
.
而在应该工作的 - 但是我得到的应该是:
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [ [pathToDir]/lib/*filename*] excludes: [] }
可以看到,Ant在Regexp中添加[Pathtodir],从而搜索
[pathToDir]/[pathToDir]/lib/*filename*
.
显然不存在。现在问题:如何修改我的版本以使其正常工作?
创建属性时(是全局完成还是在目标中完成?),目录是否 lib
存在?如果没有,则 location
属性不起作用 - 使用 a value
属性,或者更好地在创建目录后定义属性。
如上所述,问题是$ {lib.dir}也包含整个路径,从而搜索[pathtodir] / [pathtodir] / lib / 文件名。
在$ {lib.dir}属性中剪辑不需要的[pathtodir],我现在使用任务。我现在得到了以下几句,但imho不是那么好看的解决方案:
<basename property="lib.dir.rel" file="${lib.dir}"/>
<fileset dir="${basedir}" includes="${lib.dir.rel}/*filename*"/>
.
p.s.:在第二个外观上,我发现Andreas_d也找到了正确的原因和昨天的好建议,我必须忽略了: - /