Подтвердить что ты не робот

Как преобразовать путь 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
4b9b3361

Ответ 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, чтобы скомпилировать ваш проект, но вам не нужно его в войне, потому что контейнер предоставляет его. И некоторые баночки не нужны во время компиляции, но во время выполнения.
Я знаю, что не отвечаю на ваш вопрос, просто хочу, чтобы вы подумали, что вы делаете.