Как преобразовать путь Ant в FileSet?
Я пишу Ant script, чтобы упаковать проект в WAR файл. Программное обеспечение состоит из нескольких проектов со своими исходными каталогами, библиотеками и т.д.
Задача WAR имеет вложенный элемент lib
, над которым я сейчас работаю. В настоящее время у меня есть ссылка на требуемые libs как Path
(содержащие несколько FileSets
, которые я использую в ссылке на classpath. Однако lib
хочет, чтобы вход был FileSet
, и он отказывается от Path
.
Я попытался преобразовать свой Path
в FileSet
, но затем я не получил его работать как путь к классам в другом месте.
Есть ли способ конвертировать a Path
в FileSet
? Мне бы не хотелось копировать папки в каталог.
<path id="compile.libs">
<fileset dir="${common.path}/lib" includes="*.jar"/>
<fileset dir="${data.path}/lib" includes="*.jar"/>
<fileset dir="${gui.path}/lib" includes="*.jar"/>
<fileset dir="${gui.path}/WebContent/WEB-INF/lib" includes="*.jar"/>
</path>
... при использовании с <war ..><../> <lib refid="compile.libs"/> </war>
приводит к:
BUILD FAILED
build.xml:173: compile.libs doesn't denote a zipfileset or a fileset
Ответы
Ответ 1
У вас может быть несколько вариантов.
- Вы можете предоставить более одного
<lib>
вложенный элемент <war>
задача. Возможно, этого будет достаточно.
- Вы можете собрать все свои
lib
файлов за один временной
, а затем просто ссылайтесь на то, что
в качестве набора файлов.
- Существует ant -contrib
PathToFileSet задача, но это
требуется центральный корневой каталог,
и это может быть не случай с вашим
compile.libs
.
- С Ant 1.8.0 вы можете использовать mappedresources. Источник: Ant script: Предотвращение дублирования JAR в java-classpath war-lib
Думаю, я попробую вариант 1.
Ответ 2
Предполагая, что пути абсолютны, вы можете сначала преобразовать Path
в список с разделителями-запятыми, используя <pathconvert>
, а затем преобразовать список обратно в Fileset
:
<!-- create path -->
<path id="foo.path">
<pathelement location="/foo/bar/baz.txt"/>
<pathelement location="/qux/quux/quuux.txt"/>
</path>
<!-- convert foo.path to foo.list -->
<pathconvert
refid="foo.path"
property="foo.list"
pathsep=","
dirsep="/"
>
<!--
<fileset> will want relative paths, so we need to strip
the leading /. result: "foo/bar/baz.txt,qux/quux/quuux.txt"
-->
<map from="/" to=""/>
</pathconvert>
<!-- convert foo.list to fileset -->
<fileset id="foo.fileset" dir="/" includes="${foo.list}"/>
(Обратите внимание, что это предполагает Unix, вам может понадобиться немного поиграть с разделителями и еще что-то, если вы находитесь в Windows или хотите сделать его независимым от платформы.)
Ответ 3
Я решил это, поставив libs следующим образом:
<copy todir="stage/libs" flatten="true">
<path refid="classpath" />
</copy>
а затем с помощью a в задаче WAR.simple.
Ответ 4
Банки в методе classpath, используемые для компиляции, не то же самое, что нужно упаковывать внутри войны. Например: я уверен, вам нужно servlet-api.jar, чтобы скомпилировать ваш проект, но вам не нужно его в войне, потому что контейнер предоставляет его. И некоторые баночки не нужны во время компиляции, но во время выполнения.
Я знаю, что не отвечаю на ваш вопрос, просто хочу, чтобы вы подумали, что вы делаете.