Расширение набора файлов Ant не работает

Я получаю очень запутанную реакцию из моего файла сборки ant, и мне интересно, не достаточно ли я умен, или это может быть ошибкой.

В моем проекте установлено следующее свойство:

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

Затем я попытаюсь добавить некоторые файлы из этого каталога в файл jar через набор файлов (более одного ресурса):

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

Должны быть (и существуют) 3 разные библиотеки, которые подобраны таким образом. Однако, если я попытаюсь использовать следующее, это не сработает, и файлы не будут включены:

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

Обратите внимание, что единственное отличие заключается в использовании глобального свойства. Теперь простой вопрос: почему первая версия работает так, как рекламируется, а вторая - нет?

4 ответа

Решение

Пожалуйста, проверьте фактическое значение "lib.dir" непосредственно перед и, возможно, после задачи, которая использует выражение "набор файлов". Просто чтобы убедиться, что он не был случайно изменен после того, как вы установили его глобально. <echo/> задача может помочь.


Может быть, я получил решение. Описание locationатрибут является:

Устанавливает свойство в абсолютное имя файла данного файла. Если значение этого атрибута является абсолютным путем, он остается без изменений (символы / и \ преобразуются в текущие соглашения о платформах). В противном случае он берется как путь относительно основы проекта и расширяется.

Просто используйте 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 добавляет [pathToDir] в регулярное выражение, таким образом ища

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

которого, очевидно, не существует. Проблема сейчас: как мне изменить мою версию, чтобы она работала правильно?

При создании свойства (выполняется ли оно глобально или в целевом объекте?), Используется ли каталог lib существовать? Если нет, то location атрибут не работает - используйте value Атрибут вместо или лучше определить свойство после создания каталога.

Как указывалось выше, проблема заключалась в том, что ${lib.dir} тоже содержал весь путь, таким образом ища [pathToDir] / [pathToDir] / lib /filename.

Чтобы удалить нежелательный [pathToDir] в свойстве ${lib.dir}, я теперь использовал задачу. Теперь я получил следующее, но imho не очень красивое решение:

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

PS: при втором взгляде я обнаружил, что Andreas_D также нашел правильную причину и хорошее предложение вчера, которое я, должно быть, упустил из виду:-/

Другие вопросы по тегам