Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

Пожалуйста, проверьте фактическое значение «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

Другие советы

Я нашел ключ к ответу, но еще не все.

Я звонил обе версии файловых файлов с муравьей -Дебугом, а вот что происходит.

В работе, не используемой версии свойства, я получаю следующий вывод:

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] в Regexp, что ищет

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

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

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

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

Чтобы закрепить нежелательный [Pathtodir] в свойстве $ {lib.dir}, теперь я использовал задачу.Я получил сейчас следующее, но ИМХО не так приятно выглядит решение:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top