web-dev-qa-db-ja.com

ant、jarファイル、およびClass-Path oh my

Java一般的なサードパーティのjarファイルに依存するjarファイル(GlazedLists、Apache Commonsなど)を作成するためのビルド手法を再設計しようとしています。)

私はそれらすべてを{Java JRE dir}/lib/extにチャッキングしていたため、JREによって自動的に表示されるようになりましたが、特定のjarファイルを配布する必要があることを思い出せないなどの問題が発生したため、学びたいと思いますより明確にするために。

そこで、すべてをc:\ appl\Java\common \に移動し、Eclipseビルドパスに追加して、これをantファイルに定義しました。

<path id="javac_classpath">
    <fileset dir="${libDir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="c:/appl/Java/common">
        <include name="*.jar"/>
    </fileset>
</path>

Class-Pathマニフェストヘッダーを "。"に設定しています。私のjarタスクでは、関連するjarファイルをアプリケーションのjarファイルと同じディレクトリに置いても機能しないようです。それらをすべて手動で1つずつClass-Pathヘッダーに追加できますが、Class-Pathヘッダーを正しく設定する簡単な方法はありますか?

22
Jason S

これで十分です。

<path id="build-classpath">
    <fileset dir="${dist}/lib">
        <include name="*.jar"/>
    </fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar">
    <classpath refid="build-classpath"/>
</manifestclasspath>
<jar jarfile="${dist}/lib/myprog.jar"
     basedir="${build}"
     includes="com/my/prog/**" >
    <manifest>
        <attribute name="Main-Class" value="com.my.prog.MyProg"/>
        <attribute name="Class-Path" value="${lib.list}"/>
    </manifest>
</jar>

おそらくお分かりのように、Javaクラスをコンパイルして${build}に出力したことを想定しています。また、jarファイルを${dist}/libにコピーしたことも想定しています。

そうは言っても、MavenやGradleなど、依存関係のサポートが組み込まれている他のビルドシステムを検討する価値はあります。これらの他のビルドシステムは、多くの一般的なプロジェクト構造とビルド操作をすでに熟考しているので、最後まで細かくスクリプト化する必要はありません。

37
rob

欲しいのは mapper です。 Flattenmapperがおそらく最も簡単ですが、基本的にはクラスパスを指定するパス要素を作成し、その上でpathconvertを使用して、マニフェストに含めることができる文字列に変換する必要があります。

編集:includeルールを使用してパス要素を作成できるため、jarで終わるディレクトリ内のすべてが**/*.jar

4
Tim Bender

Ant 1.7以降では、manifestclasspathタスクが前進します。 1.7より前のバージョンのantを使用している場合、manifestclasspathタスクは存在しません。

以下は同じ結果になります:-

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

<pathconvert property="lib.list" pathsep=" ">
    <path refid="build.classpath" />
    <mapper>
        <chainedmapper>
            <flattenmapper />
        </chainedmapper>
    </mapper>
</pathconvert>

<target name="generate.jar">
    <jar destfile="${dist}/lib/myprog.jar">
        <manifest>
            <attribute name="Main-Class"
                value="com.mypackage.MyClass" />
            <attribute name="Class-Path" value="${manifest.classpath}" />
        </manifest>
    </jar>
</target>
3
Peter Jamieson

クラスパスディレクトリには、セキュリティ上の理由から、デフォルトではJarファイルが含まれていません。誰かがそこにjarファイルを置く可能性があり、知らないうちにコードが上書きされてロードされる可能性があります。 Jarファイルをクラスパスに追加できるようにするために別のフラグまたは終了トークンを追加することについての議論があったことは知っていますが、私のメモリーが機能する場合、それはバージョン7で予定されています。しかし、最後の部分では間違っている可能性があります。

0
aperkins

JarファイルのClass-Pathマニフェストヘッダーでは、含めるjarファイルを明示的にリストする必要があります。クラスパスにディレクトリをリストすると、Javaはjarファイルではなく、そのディレクトリで.classファイルを検索します。

0
Dave DiFranco