Сценарий Ant: предотвращение дублирования JAR-файла в javac-classpath war-lib - PullRequest
9 голосов
/ 18 февраля 2011

У меня есть сценарий ANT, и у меня много дублированных путей к тем же установленным JAR-файлам.Но в classpath, а также в элементе war так много двойных формулировок.

<path id="my.classpath">
  <pathelement location="folderA/subFolderA/1.0/A.jar"/>
  <pathelement location="folderC/subFolderB/1.0/B.jar"/>
  <pathelement location="folderF/subFolderZ/2.0/Z.jar"/>
  <pathelement location="compile/subFolderX/1.0/onlyForJavac.jar"/>
</path>
....
<javac ...>
 <classpath refid="my.classpath" />
</javac>
....
<war ...>
 <lib file="folderA/subFolderA/1.0/A.jar"/>
 <lib file="folderC/subFolderB/1.0/B.jar"/>
 <lib file="folderF/subFolderZ/2.0/Z.jar"/>
 <lib file="moreFolderF/subFolderZ/2.0/additionFile.jar"/>
 <lib file="moreFolderF/subFolderZ/2.0/additionRuntimeFile.jar"/>
</war>

Я хочу объединить их в ОДИН список, который легче обновлять.

Но язаблокирован, так как я не знаю, как разделить структуру, похожую на путь, с структурой, похожей на набор файлов.

Ответы [ 2 ]

12 голосов
/ 18 февраля 2011

Начиная с Ant 1.8.0, существует новая коллекция ресурсов - mappedresources, которую можно использовать вместо элемента war task lib.

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

<war ... >
    <mappedresources>
        <restrict>
           <path refid="my.classpath"/>
           <type type="file"/>
        </restrict>
        <chainedmapper>
          <flattenmapper/>
          <globmapper from="*" to="WEB-INF/lib/*"/>
        </chainedmapper>
    </mappedresources>
</war>

Эта функция была добавлена, чтобы разрешить длительный запрос функции , чтобы сделать задачу выравнивать банки при развертывании вWEB-INF/lib.

предыдущий ответ:

Хотя вы не можете легко преобразовать путь к набору файлов с помощью vanilla Ant, вы можете пойти другим путем.Поэтому одним из вариантов будет определение ваших jar-файлов в наборе файлов и вывод из него пути.Возможно, что-то вроде этого:

<fileset id="my.fileset" dir="${basedir}">
    <include name="folderA/subFolderA/1.0/A.jar"/>
    <include name="folderC/subFolderB/1.0/B.jar"/>
    <include name="folderF/subFolderZ/2.0/Z.jar"/>
    <include name="moreFolderF/subFolderZ/2.0/additionFile.jar"/>
    <include name="moreFolderF/subFolderZ/2.0/additionRuntimeFile.jar"/>
</fileset>

<path id="my.classpath">
    <fileset refid="my.fileset" />
</path>

<!-- javac stays the same -->

<war ...>
    <lib refid="my.fileset" />
</war>

Другая возможность заключается в использовании ant-contrib pathtofileset task .

0 голосов
/ 18 февраля 2011

Другое решение, возможно, «не самое лучшее», заключается в том, чтобы поместить требуемый jar-файл в WEB-INF / lib, а затем установить там путь к классам.

<path id="compile.classpath">
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

Когда пришло время строить войну, вам не нужно беспокоиться о <lib>, поскольку банки уже помещены в папку WEB-INF / lib.

<war destfile="${dist.dir}/${project.name}.war" webxml="${web.dir}/WEB-INF/web.xml">
        <fileset dir="${web.dir}"/>
        <classes dir="${build.dir}/classes"/>
    </war>
...