Antを使用して、いくつかのJavaプロジェクトをビルドしています。
一部では、外部依存関係を含むlib/
ディレクトリがJARファイルの形式であります。
ビルド中に、バンドルjarファイルにlib/
ディレクトリの各jarのzipfileset
を追加することにより、依存関係とともにプロジェクトのコードを含むバンドルjarを作成します。
問題は、jarを追加するか、名前を変更するたびに、build.xml
ファイルを更新することを忘れないでください。これらのzipfilesets
を自動的に追加する方法が見つからないためです。特定のパターンのすべてのjar(例えばlib/*.jar
)。
これを行うためのより良い方法はありますか?
このために独自のAntタスクを作成するか、Groovyのant APIを使用してプログラムでこれを行うことを検討しましたが、「Vanilla」アリを使用してこれを行う方法があるかどうか疑問に思っていました。
私のターゲットには、次のようなものがあります。
<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>
zipgroupfileset
を使用します。例えば:
<target name="jar">
<jar destfile="foo.jar" basedir="${dir.classes}">
<zipgroupfileset dir="lib" includes="*.jar"/>
</jar>
</target>
zipgroupfileset
は Zip タスクで文書化されています。
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です。
Libディレクトリの下のすべてのjarファイルを含むjar(test.jarという名前)を作成するantターゲットの簡単な例を次に示します。たぶんこれはあなたの問題を解決するでしょうか?
<target name="jar">
<jar destfile="test.jar">
<fileset dir="lib/" includes="**/*.jar" />
</jar>
</target>