Мы с коллегой придумали ответ, просмотрев источник <zip>
и <concat>
.На самом деле есть два ответа:
<concat>
Реализация интерфейса ResourceCollection
странная, но мы понимаем, почему. - Есть способ обойти это.
Для # 1, в то время как <concat>
- это ResourceCollection
(например, FileSet
), под капотом возвращается имя единственного Resource
, содержащее жестко закодированное значение:
"concat (" + String.valueOf(c) + ")";
Выглядит знакомо?
Имя ресурсов обычно игнорируется - за исключением <zip>
и связанных с ним задач, которые используют имя ресурса в качестве имени ZipEntry
.Так как <concat>
возвращает странное имя, это то, что мы получаем в zip-файле.
Я не совсем понял, почему я получаю несколько записей, но это не имеет значения: наблюдение ведет кзапутанное решение.
Поскольку я знаю имя ZipEntry
, которое я хочу создать, я могу использовать <mapper>
, чтобы присвоить ресурсу <concat>
имя.Вот что я придумал во всей своей красе:
<zip destfile="target/distribution.zip">
<fileset dir=".">
<exclude name="target/**" />
<exclude name="CHANGES.txt" />
</fileset>
<mappedresources>
<concat>
<fileset file="CHANGES.txt" />
<filterchain>
<expandproperties />
</filterchain>
</concat>
<mergemapper to="CHANGES.txt" />
</mappedresources>
</zip>
Как говорит мой коллега: «В Ant каждая проблема может быть решена с помощью картографа».
Это работает только для Ant 1.8+потому что в этот выпуск было добавлено <mappedresources>
.
Я собираюсь опубликовать некоторые комментарии в списке рассылки Ant и предложить несколько улучшений:
- Разрешить имя ресурса длябыть указан как атрибут в
<concat>
, когда он используется в качестве ResourceCollection
. - Бросить исключение (и не создавать синтетическое значение), если вызывается
getName()
без указания значения. - Наконец, хотя это и не связано напрямую, я бы хотел, чтобы
<expandproperties>
мог взять <propertyset>
, чтобы я мог контролировать, какие свойства подставляются.