2009-05-13 5 views
35

以下のビルドファイルで、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> 

答えて

41

Ant 1.7以上を想定すると、manifestclasspathタスクを使用できます。詳細については

<path id="dep.runtime"> 
    <fileset dir="./lib"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 
<property name="dep_cp" value="${toString:dep.runtime}" /> 

<target name="default"> 
    <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> 
     <classpath refid="dep.runtime" /> 
    </manifestclasspath> 
    <echo message="Build Classpath: ${dep_cp}" /> 
    <echo message="Manifest Classpath: ${manifest_cp}" /> 
</target> 
+1

これは動作しますが、クラスパスに絶対パスがない場合に限ります。たとえば、 '/ usr/share/java/hibernate3.jar'にインストールされたdebianパッケージ' libhibernate3-java'を使用していて、それをクラスパスに含めると、manifestclasspath antタスクはエラーを投げます。 Qianjiguiのソリューションはまだ動作します。 – joscarsson

2

、それを行うのは簡単です:

<path id="lib.path> 
    <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
    </fileset> 
</path> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <path refid="lib.path"/> 
</path> 

<property name="jar.class.path" refid="lib.path"/> 

EDITは申し訳ありませんが、私は質問を誤解しました。これを試してみてください:

<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="." includes="${jar.class.path}"/> 
</path> 
+0

いいえ、それは間違っています。この場合、jar.class.pathの値は空白ではなくコロンで区切られ、さらに悪いことに、完全パスを使用してjarマニフェストには役に立たなくなります。 – amarillion

+0

コメントに対する編集回答。 –

+0

ええ、私が与えた例ではうまくいきます。しかし、私は本当にファイルセットからjarクラスパスを構築したいと思います。それ以外の方法ではなく、ワイルドカードを使うことができます。 – amarillion

1

あなたはプレーンな文字列に(ファイルセットを含めることができます)のパスに変換するために<pathconvert>を使用することができます。あなたはおそらく、最終的に、最終的な性質に操作文字列をロードするために<ロードファイル>を使用し、主要なパスビットをチョップするか<が>または<replaceregexp>を置き換える使用し、ファイルにその文字列を>エコー<する必要があります。

実装は読者の練習として残しました。

+0

これは機能します。私はいくつかの時点で私のantスクリプトでこの解決策を使用しました。しかし、それは乱雑です。 –

+0

本当にうんざりです。私は実際にクロスプラットフォームの方法で主要なパスのビットを切り刻む実際の例を見てみたいと思います... – amarillion

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

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

<target depends="compile" name="buildjar"> 
    <jar jarfile="${basedir}/${test.jar}"> 
    <fileset dir="${build}" /> 
    <manifest> 
     <attribute name="Main-Class" value="com.mycompany.TestMain"/> 
     <attribute name="Class-Path" value="${manifest.classpath}"/> 
    </manifest> 
</jar> 
</target> 

this articleをチェックしてください。

+0

これはとても役に立ちました。 –

+0

この回答はなぜ受け入れられないのですか?これは完璧で、複数のパスコンバータでも機能します – ha9u63ar

関連する問題