Как переименовать файлы, если они включены в jar с помощью задачи ant jar? - PullRequest
13 голосов
/ 22 сентября 2009

Я хочу поместить в файл набор файлов, которые выглядят так:

yay/my.jar
boo/my.jar
foo/my.jar
bar/my.jar

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

yay_my.jar
boo_my.jar
foo_my.jar
bar_my.jar

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

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

Ответы [ 3 ]

17 голосов
/ 27 сентября 2009

Вы можете использовать zipfileset с атрибутом fullpath, чтобы переименовать имя файла в банке:

<jar destfile="newjar.jar">
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/>
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/>
    <!-- etc. -->
</jar>

Вы не можете использовать маппер с этой техникой, однако, вам придется перечислять каждый файл JAR явно. Если вы можете предположить, что каждый файл имеет имя my.jar, и все они находятся в непосредственном дочернем каталоге, вы можете использовать цель subant, чтобы объединить их все:

<target name="glom">
    <subant genericantfile="${ant.file}" target="update-jar">
        <dirset dir="." includes="*"/>
    </subant>
</target>

<target name="update-jar">
    <basename file="${basedir}" property="dirname"/>
    <property name="path" value="${dirname}_my.jar"/>
    <jar destfile="../newjar.jar" update="yes">
        <zipfileset dir="." includes="my.jar" fullpath="${path}"/>
    </jar>
</target> 
2 голосов
/ 19 октября 2012

Если вы не хотите (или не можете легко) перечислить каждый файл по отдельности, одним из решений является использование задачи Zip, которая допускает вложенный <mappedresources> (Ant 1.8.0+). После завершения задачи Zip вы можете использовать задачу Jar для добавления / обновления манифеста и / или добавления индекса.

Предположим, например, что в дополнение к желанию

yay_my.jar
boo_my.jar
foo_my.jar
bar_my.jar

в выходном JAR, у вас также есть каталог stuff/, содержащий некоторые файлы и подкаталоги. Если вы хотите, чтобы содержимое stuff/ было включено в JAR, но вы хотите, чтобы stuff/subdir/* было добавлено как other_subdir/*, рассмотрите следующее:

<zip destfile="newjar.jar">
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/>
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/>
    <!-- etc. -->

    <mappedresources>
        <fileset dir="stuff"/>
        <compositemapper>
            <globmapper from="subdir/*" to="other_subdir/*"/>
            <identitymapper/>
        </compositemapper>
    </mappedresources>
</zip>
<!-- Update the newly-created ZIP in-place to add a basic manifest -->
<jar destfile="newjar.jar" update="true"/>

Я протестировал этот файл сборки, и он работает с Ant 1.8.2. Однако, если после его изменения Муравей начинает бросать NullPointerException, см. Ошибка 54026 .

2 голосов
/ 22 сентября 2009

Обновление: вы, вероятно, на самом деле хотите копировать задачу вместо перемещения, но regexp mapper работает одинаково для копирования и перемещения.

Следующее регулярное выражение скопирует все jar-файлы из каталога jars в jars_out, сопоставив [folder] / [file] .jar с [folder] _ [file] .jar.

<copy todir="./jars_out">
  <fileset dir="jars"/>
  <mapper type="regexp" from="([^/\\]*)[/\\](.*)\.jar$$" to="\1_\2.jar"/>
</copy>

Для работы преобразователя регулярных выражений необходим соответствующий jar-код реализации регулярного выражения в classpath. Доступны различные реализации:

...