複数の JAR ファイルを解凍し、ant ビルド スクリプトを使用して 1 つの JAR に再構築したいと考えています。これは可能ですか?
4 に答える
はい、ant で可能です。jar ファイルは基本的に、特別なマニフェスト ファイルを含む zip です。したがって、解凍するには、jar を解凍する必要があります。Ant にはunzipタスクが含まれています。
プロジェクト内のすべての jar ファイルを unzip/unjar するには:
<target name="unjar_dependencies" depends="clean">
<unzip dest="${build.dir}">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</unzip>
</target>
明らかに、最初に ${build.dir} と ${lib.dir} を宣言する必要があります。この行<include name="**/*.jar" />
は、最終的に jar 拡張子を持つすべてのファイルを含めるように ant に指示します。必要に応じて、そのインクルードを微調整できます。
すべてを jar にパックするには、jarタスクを使用します。
<target name="make_jar" depends="compile, unjar_dependencies">
<jar basedir="${build.dir}"
destfile="${dist.dir}/${project_name}.jar">
<manifest>
<attribute name="Main-Class" value="${mainclass}" />
</manifest>
<fileset dir="${build.dir}">
<include name="**/*.class" />
</fileset>
<fileset dir="${src.dir}">
<include name="applicationContext.xml" />
<include name="log4j.properties" />
</fileset>
</jar>
</target>
この例では、さまざまなファイルセットを含めます。1 つのファイルセットに、コンパイルされたすべてのクラスを含めます。別のファイルセットには、この特定のプロジェクトが依存する 2 つの構成ファイルが含まれています。
はい、そうです !
2 つの可能性があります。
- エスペンの答え:
特定のディレクトリ内のすべての jar ファイルから 1 つの jar ファイルを作成する 1 つの可能な解決策:
<target name="dependencies.jar">
<jar destfile="WebContent/dependencies.jar">
<zipgroupfileset dir="lib/default/" includes="*.jar"
excludes="*.properties" />
</jar>
</target>
これは、一部の jar にあるコンテンツを除外する必要がない場合に役立ちます (たとえば、一部のプロパティ構成ファイルが自分のものをオーバーライドする可能性があるなど)。ここで、excludes プロパティは、dir プロパティからファイルを除外しています。
- zipファイルセットを使用
もう 1 つの解決策は、zipfileset タグを使用することです。この場合、excludes プロパティは、マージされる jar からコンテンツを除外します。
<jar destfile="your_final_jar.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="main.class"/>
<attribute name="Class-Path" value="."/>
</manifest>
<zipfileset
excludes="META-INF/*.SF"
src="/path/to/first/jar/to/include.jar"/>
</jar>
- もちろん、2 つのタグ (zipfileset と zipgroupfileset) を同じ jar タグ内で組み合わせて、2 つの長所を活かすことができます。
はい、可能です。
特定のディレクトリ内のすべての jar ファイルから 1 つの jar ファイルを作成する 1 つの可能な解決策:
<target name="dependencies.jar">
<jar destfile="WebContent/dependencies.jar">
<zipgroupfileset dir="lib/default/" includes="*.jar"
excludes="*.properties" />
</jar>
</target>
JarJarと呼ばれる jar の再パッケージ化に特化したプロジェクトもあります。これを使用して、複数の Jar を 1 つに再パッケージ化できます。要件に応じて、バージョンの競合を防ぐためにクラスの名前を変更することもできます。
開始ページから:
この例では、jaxen.jar のクラスを含め、「org.jaxen」で始まるすべてのクラス名を代わりに「org.example.jaxen」で始まるように変更するルールを追加します (架空の世界では、example.org ドメインを制御します)。 :
<target name="jar" depends="compile">
<taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
classpath="lib/jarjar.jar"/>
<jarjar jarfile="dist/example.jar">
<fileset dir="build/main"/>
<zipfileset src="lib/jaxen.jar"/>
<rule pattern="org.jaxen.**" result="org.example.@1"/>
</jarjar>
</target>