ANT

2016-04-01 13 views
1

でたzipfileset文のリストを再利用する私はに似てターゲットといくつかの脂肪を一緒に実行可能なjarを置くのbuild.xmlを持っている:ANT

コードは、Eclipse(エクスポート実行可能なJAR)で、マイナーで生成された
<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

    lots and lots of more JARs here.... 
</target> 

私によって変わる

含まれるJarのリストは、実際はかなり長いです。私はこれらのファットジャーのいくつかを作りました、そして、どのように私は各ターゲットの<zipfileset>ステートメントをリストすることを避けることができたのだろうか?

私はそれらをすべて一緒に叩き、それぞれのファットジャービルドターゲットから参照することはできますか?私のbuild.xmlが何百と何百もの行に膨らませないようにする目的で、すべて。また、もし私がどこかの定義を持つことができれば、それぞれのターゲットに新しいJARを追加するという苦労はなくなります。後で再利用するためのJarファイルセットを保存する必要がある場合は

<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
     <manifest> 
      <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
      <attribute name="Class-Path" value="."/> 
     </manifest> 
     <fileset dir="./classes"/> 
     <zipgroupfileset dir="lib/" includes="*.jar" excludes="META-INF/*.SF" /> 
    </jar> 
</target> 

、あなたが行うことができます:

答えて

1

あなたが知っている限り、あなたのzipfilesetエントリのリストは、それぞれの構築されたjarファイルについて常に同じですか?おそらく、zipfilesetエントリを含むマクロを作成し、変数を使用して各ターゲットのコンテキストのマクロを調整することを検討してください。

<macrodef name="make-jar"> 
    <attribute name="destfile"/> 
    <attribute name="mainclass"/> 
    <attribute name="classpath"/> 
    <attribute name="obj.dir"/> 
    <sequential> 
     <jar destfile="@{destfile}" filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" value="@{mainclass}"/> 
       <attribute name="Class-Path" value="@{classpath}"/> 
      </manifest> 
      <fileset dir="@{obj.dir}"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

      lots and lots of more JARs here.... 
     </jar> 
    </sequential> 
</macrodef> 

<target name="create_myapp_jar"> 
    <make-jar destfile="./production/myapp.jar" mainclass="com.something.entrypoints.MyApp" classpath="." obj.dir="./classes"/> 
</target> 
+0

これは美しく働きました。私はマクロのことも起こってしまいました....残念ですが、私は両方の答えを「正しい」とマークすることはできません。どちらが最高かを考える必要があります。 –

1

zipgroupfilesetは、これを実現するために使用することができ

<fileset dir="lib" id="lib_jars"> 
    <include name="*.jar"/> 
</fileset> 
<jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipgroupfileset refid="lib_jars" /> 
</jar> 

EDIT:

excludesdirディレクトリ内のファイルのみを除外し、th e Jarファイル自体は、Ant: Exclude files from merged jar fileで説明されています。そこに簡単な回避策を提供する答えがあります。

+0

ありがとう!これは私の直接の問題を解決しますが、これはjarファイルが同じディレクトリにある場合にのみ有効です(これはもちろん最も一般的な状況です)。私がそれを望むなら、とにかくジャーのリストを「グループ化」して、名前を付けて名前を参照することができますか? –

+0

実行時に、「スレッドの例外」メイン「java.lang.SecurityException:マニフェストのメイン属性のシグネチャファイルダイジェストが無効です」というメッセージが表示されます。 –

+0

@PeterAnderssonあなたが正しいです。 'excludes'は' zipgroupfileset'のためにここで期待どおりに動作しません。私は答えを更新しました。 – manouti