web-dev-qa-db-ja.com

antでバンドルjarを作成する

Antを使用して、いくつかのJavaプロジェクトをビルドしています。
一部では、外部依存関係を含むlib/ディレクトリがJARファイルの形式であります。

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

問題は、jarを追加するか、名前を変更するたびに、build.xmlファイルを更新することを忘れないでください。これらのzipfilesetsを自動的に追加する方法が見つからないためです。特定のパターンのすべてのjar(例えばlib/*.jar)。

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

このために独自のAntタスクを作成するか、Groovyのant APIを使用してプログラムでこれを行うことを検討しましたが、「Vanilla」アリを使用してこれを行う方法があるかどうか疑問に思っていました。

62
abyx

私のターゲットには、次のようなものがあります。

<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もこれらのjarについて知る必要があります。

<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>
53
jonescb

zipgroupfilesetを使用します。例えば:

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

zipgroupfilesetZip タスクで文書化されています。

29
Jason Day

NetBeansを使用している場合、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です。

8
user725434

Libディレクトリの下のすべてのjarファイルを含むjar(test.jarという名前)を作成するantターゲットの簡単な例を次に示します。たぶんこれはあなたの問題を解決するでしょうか?

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