2009-09-22 23 views
13
私は瓶の中に次のようになり、ファイルのセット入れたい

:プロセスではantのjarタスクによって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ファイルを作成するときにマッパーを適用する方法、またはこのような変換を実行するにはどうすればよいですか?私はすべてのファイルを私が望むディレクトリ構造にコピーしたくないので、私たちのビルドシステムがどのように動作しているのかを知ることができます。

答えて

2

更新:おそらく実際にはcopy taskが移動するのではなく、regexp mapperがコピーと移動の両方で同じように機能するとします。

次の正規表現は、jarsディレクトリのすべての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> 

regexpマッパーでは、クラスパス上で適切なregexp実装jarが動作する必要があります。様々な実装が用意されています

+0

私はどのようにして –

+0

を表示するかの例を追加します。それは素晴らしいですが、ファイルの余分なコピーを作成せずにjarを構築するという私の目標を達成しません。 Moveはコピーを避けますが、ソースファイルが変更された場合にのみ構築するたびにjarファイルを再構築します。 – skiphoppy

+0

しかし、あなたが作成したマッパータグは素晴らしいです。私は自分のものを思いつくのではなく、それを借りています。 :)ファイルセットとjarファイルで作業するためにマッパーを使用することができなかったので、私はまだ必要なマッパーを実際にビルドするのに十分なほど十分には足りなかった。 – skiphoppy

17

あなたは瓶の中のファイル名の名前を変更するfullpath属性でzipfilesetを使用することができます。

<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ファイルを明示的にリストする必要があります。あなたがしたい(またはできない場合

<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> 
+0

+1 jarタスク中にファイルの名前を簡単に変更できます。ありがとう。 – Damo

2

を:あなたは、すべてのファイルがmy.jar命名されていると仮定することができ、そして、彼らはすべての直接の子ディレクトリにある場合、あなたはそれらすべてをグロブするsubantターゲットを使用することができます簡単に)各ファイルを個別にリストするには、Zipタスクを使用してネストされた<mappedresources>(Ant 1.8.0+)を使用する方法があります。 Zipタスクが完了したら、Jarタスクを使用してマニフェストを追加/更新したり、インデックスを追加することができます。

と仮定、例えば、それは、出力JARに

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

を望むに加えて、あなたはまた、いくつかのファイルとサブディレクトリを含む、ディレクトリstuff/を持っています。あなたはJARに含まstuff/の内容をしたいが、あなたは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がNullPointerExceptionを投げ始める場合は、Bug 54026を参照してください。

関連する問題