以下のビルドファイルで、jarターゲットはマニフェストのclass-pathのjar.class.pathプロパティを参照します。コンパイル対象はproject.class.pathを参照しますマニフェストのクラスパスをAntで<classpath>から生成
jar.class.pathとproject.class.pathは非常に似ているため、ここでは冗長性があります。ライブラリが追加されたときにそれらは更新されなければならず、ライブラリのリストが非常に長くなると苦痛になる可能性があります。より良い方法がありますか?どんな解決策もクロスプラットフォームであり、常に相対パスを使用する必要があります。
編集:
ファイルセットからJARクラスパスを生成する必要がありますが、それ以外の方法では生成されないため、たとえばワイルドカードを使用できます。すべてのJARファイルをディレクトリに含めます。あなただけの2つ(またはそれ以上)のパスの間で共有される共通のサブパスをしたい場合は
<?xml version="1.0"?>
<project name="Higgins" default="jar" basedir=".">
<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/>
<path id="project.class.path">
<pathelement location="build"/>
<fileset dir="lib">
<include name="forms-1.2.0.jar"/>
<include name="BrowserLauncher.jar"/>
</fileset>
</path>
<target name="prepare">
<mkdir dir="build"/>
</target>
<target name="compile" depends="prepare" description="Compile core sources">
<javac srcdir="src"
includes="**"
destdir="build"
debug="true"
source="1.5">
<classpath refid="project.class.path"/>
</javac>
</target>
<target name="jar" depends="compile" description="Generates executable jar file">
<jar jarfile="higgins.jar">
<manifest>
<attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/>
<attribute name="Class-Path" value="${jar.class.path}"/>
</manifest>
<fileset dir="build" includes="**/*.class"/>
<fileset dir="src" includes="**/*.properties"/>
</jar>
</target>
</project>
これは動作しますが、クラスパスに絶対パスがない場合に限ります。たとえば、 '/ usr/share/java/hibernate3.jar'にインストールされたdebianパッケージ' libhibernate3-java'を使用していて、それをクラスパスに含めると、manifestclasspath antタスクはエラーを投げます。 Qianjiguiのソリューションはまだ動作します。 – joscarsson