13

次のような一連のファイルを jar に入れたい:

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

その過程で、次のようにすべての名前を変更したいと思います。

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

これを達成するためにマッパーを使用したいと思っていましたが、使用しているファイルセット要素と jar タスクはどこでもサポートしていないようです。

jar を作成するときにマッパーを適用する方法、またはこのような変換を実行するにはどうすればよいですか? すべてのファイルを必要なディレクトリ構造にコピーして、あちこちに複製を作成することは避けたいと思います。これが、現在のビルド システムの仕組みです。

4

3 に答える 3

17

zipfileset属性付きのaを使用しfullpathて、jar内のファイル名の名前を変更できます。

<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> 
于 2009-09-26T23:43:42.767 に答える
2

各ファイルを個別にリストしたくない (または簡単にリストできない) 場合、1 つの解決策は、ネストされた<mappedresources>(Ant 1.8.0+) を許可する Zip タスクを使用することです。Zip タスクが完了すると、Jar タスクを使用してマニフェストを追加/更新したり、インデックスを追加したりできます。

たとえば、欲しいことに加えて、

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

出力 JAR には、stuff/いくつかのファイルとサブディレクトリを含む directory もあります。のコンテンツを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 で動作します。ただし、変更後に Ant が をスローし始めた場合は、 Bug 54026NullPointerExceptionを参照してください。

于 2012-10-18T23:33:14.850 に答える
2

更新: 実際には移動ではなくコピー タスクが必要な場合がありますが、正規表現マッパーはコピーと移動の両方で同じように機能します。

次の正規表現は、jars ディレクトリ内のすべての jar を 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 が必要です。さまざまな実装が利用可能です:

于 2009-09-22T14:32:07.750 に答える