2009-11-30 11 views
57

私はいくつかのJavaプロジェクトをビルドするためにAntを使用しています。一部で
は、私は、JARファイルの形で、外部依存関係が含まれているlib/ディレクトリを、持っています。antでバンドルjarを作成する

ビルド中に、lib/ディレクトリにある各jarのバンドルjarファイルzipfilesetを追加することによって、プロジェクトのコードと依存関係を含むバンドルされたjarを作成します。

問題は、私がすべて含まれます自動でそれらzipfilesetsを追加するための方法を見つけることができなかったとして、私はjarファイルを追加したり、名前を変更するたびに、私は、build.xmlファイルを更新するために覚えておく必要があること、です特定のパターンのジャー(例えば、lib/*.jar)。

これを行うためのより良い方法はありますか?

私はこのために私自身のAntタスクを書いて考えられ、またはプログラムでこれを行うには、GroovyのアリAPIを使用しますが、「バニラ」antを使用してこれを行うための方法があるかどう思っていたしました。ここで

答えて

50

、私はこのようなものがあります:

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> 
    <zipgroupfileset dir="dist" includes="*.jar"/> 
    <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/> 

    <manifest> 
     <attribute name="Main-Class" value="${main.class}"/> 
     <attribute name="Class-Path" value="${mf.classpath}"/> 
    </manifest> 
</jar> 

をそしてここで私は私のクラスパスを構築する方法である:

<path id="build.classpath"> 
    <fileset dir="${basedir}/"> 
     <include name="${lib.dir}/*.jar"/> 
    </fileset> 
</path> 

<pathconvert property="mf.classpath" pathsep=" "> 
    <path refid="build.classpath"/> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*.jar" to="lib/*.jar"/> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

mf.classpathが掲載さパッケージターゲットから使用されています上記。 この部分は他の場所からコピーしたので、私はそれに精通しているわけではありません。

クイック編集。 Javacもこれらの瓶について知っておく必要があります。

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

<target name="compile"> 
    <mkdir dir="${build.dir}"/> 
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/> 
</target> 
+1

ここには、この回答では見つからない最終的な 'build.xml'(大きな画像)を含むjonescbのものと同様の方法があります:http://www.mkyong.com/ant/ant-create-a-fat-jar -file/ – Stephan

0

は、libディレクトリの下にあるすべてのjarファイルが含まれています(test.jarという名前)jarファイルを作成するAntターゲットの簡単な例です。多分あなたの問題を解決するでしょうか?私の目標で

<target name="jar"> 
    <jar destfile="test.jar"> 
     <fileset dir="lib/" includes="**/*.jar" /> 
    </jar> 
</target> 
+1

jarファイルは単純にネストできますか?これがうまくいくと思いますか? – abyx

+0

hmmm、私はそうは思わない、私は戦争の代わりに戦争とwebappsを考えていた、申し訳ありません '試合。 – Upgradingdave

29

zipgroupfilesetを使用してください。たとえば:

<target name="jar"> 
    <jar destfile="foo.jar" basedir="${dir.classes}"> 
     <zipgroupfileset dir="lib" includes="*.jar"/> 
    </jar> 
</target> 

zipgroupfilesetZipタスクに記載されています。ここでのNetBeansを使用してあなたのそれらのために

+0

jonescbが答えたので、それが本当に解決策です。 Zipタスクに隠されているので、これを見たことはありません – abyx

+0

jarファイルには通常、MANIFESTディレクトリに余分なファイルがある場合の大きな問題です。例えば、スプリングフレームワークジャーの多くにはspring.handlers、spring.schemas、spring.toolingファイルが含まれています。これらを処理する方法はわかりません。 – ticktock

+1

@GeorgeBaxter同じことを探していて、[this](http://stackoverflow.com/a/24083318/2208271)をやってしまった。あなたがより良い解決策を見つけたら教えてください。 – Sithsu

6

あなたがzipgroupfilesetを使用してバンドルされたライブラリとJARアーカイブを作成する方法です。

<target name="-post-jar"> 

    <property name="store.jar.name" value="MyJarName"/> 

    <property name="store.dir" value="dist"/> 
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/> 

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/> 

    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> 
     <zipgroupfileset dir="dist" includes="*.jar"/> 
     <zipgroupfileset dir="dist/lib" includes="*.jar"/> 

     <manifest> 
      <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 

    <zip destfile="${store.jar}"> 
     <zipfileset src="${store.dir}/temp_final.jar" 
     excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/> 
    </zip> 

    <delete file="${store.dir}/temp_final.jar"/> 
    <delete dir="${store.dir}/lib"/> 
    <delete file="${store.dir}/README.TXT"/> 
</target> 

私はbuild.xmlファイルの最後に、このターゲット定義を追加しました。ターゲット名は-post-jarです。

関連する問題