【问题标题】:Ant Fileset Expansion doesn't workAnt 文件集扩展不起作用
【发布时间】:2023-03-12 06:40:01
【问题描述】:

我从我的 ant 构建文件中得到一个非常令人困惑的反应,我想知道是我不够聪明还是这实际上是一个错误。

我在我的项目中全局设置了以下属性:

<property name="lib.dir" location="lib"/>

然后我会尝试通过fileset(多个资源)将这个目录中的一些文件添加到jar文件中:

<fileset dir="${basedir}" includes="lib/*filename*"/>

应该有(并且存在)3 个不同的库,它们以这种方式匹配。但是,如果我尝试使用以下内容,它将不起作用并且不包含任何文件:

<fileset dir="${basedir}" includes="${lib.dir}/*filename*"/>

请注意,唯一的区别在于全局属性的用法。现在是一个简单的问题:为什么第一个版本可以像宣传的那样工作,而第二个则不能?

【问题讨论】:

  • 我建议使用-verbose-debug 运行Ant 并检查任务周围的输出。 Ant 会准确告诉您它正在检查哪些文件以添加到您的文件集中,以及评估时lib.dir 的值。
  • 我尝试使用 -debug 运行 ant,我发现这一行与此处相关:fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [ [pathToDir]/lib/* glpkjni*] excludes: [] } 这表明它应该像宣传的那样工作......

标签: ant properties fileset


【解决方案1】:

请在使用“fileset”表达式的任务之前和之后检查“lib.dir”的实际值。只是为了确保在全局设置后它没有被意外更改。 &lt;echo/&gt; 任务可以提供帮助。


也许我得到了解决方案。 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

【讨论】:

  • 我在 jar tast 之前添加了以下 echo 任务: 输出为:[ echo] DEBUG:文件集包括:[pathToDir]/lib/*glpkjni* 这应该表明,至少属性评估应该实际工作......
【解决方案2】:

我找到了答案的线索,但还不是全部。

我使用 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 add's the [pathToDir] in the regexp,从而搜索

[pathToDir]/[pathToDir]/lib/*filename*

这显然不存在。现在的问题:我必须如何修改我的版本才能使其正常工作?

【讨论】:

    【解决方案3】:

    创建属性时(是在全局还是在目标中完成?),目录lib 是否存在?如果不是,location 属性不起作用 - 请改用value 属性或在创建目录后更好地定义属性。

    【讨论】:

      【解决方案4】:

      如上所述,问题在于 ${lib.dir} 也包含整个路径,因此搜索 [pathToDir]/[pathToDir]/lib/filename

      为了剪掉 ${lib.dir} 属性中不需要的 [pathToDir],我现在使用了这个任务。我现在得到了以下,但恕我直言不是很好看的解决方案:

      <basename property="lib.dir.rel" file="${lib.dir}"/>
      <fileset dir="${basedir}" includes="${lib.dir.rel}/*filename*"/>
      

      P.S.:再看一遍,发现昨天Andreas_D也找到了正确的理由和一个很好的建议,我一定是忽略了:-/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 2021-07-09
        相关资源
        最近更新 更多