2009-07-27 7 views
20

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

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

だから私は、cにそれらのすべてを移動:、共通\ \ \ APPL \ javaのパスを構築するのEclipseに追加し、A及び私の蟻ファイルでこれを定義した:

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

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

答えて

36

これはあなたが必要とするすべてである:

<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> 

あなたはおそらく見ることができるように、それはあなたが${build}にあなたのJavaクラスおよび出力、それらをまとめました想定しています。また、あなたはあなたのjarfilesを${dist}/libにコピーしたと仮定します。

つまり、MavenやGradleなどの依存関係のサポートが組み込まれている他のビルドシステムを検討する価値があります。これらの他のビルドシステムは、すでに多くの一般的なプロジェクト構造とビルドオペレーションを考えてきました。したがって、すべてのスクリプトを最後まで細かく記述する必要はありません。

+1

ああ...それは私が探していたものです。優れた! –

+0

Hmmm。修正:$ {dist}/libディレクトリがまだ存在しない可能性があるため、新しくビルドすると機能しません。 タスクの実行を遅らせる方法はありますか? –

+0

DOH!決して気にしないで、私はをantファイルのルートセクションに入れました。ちょうどそれをjarタスクに入れて固定しました。再度、感謝します!!!!! –

0

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

0

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

4

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

編集:あなたはアリにいるので、あなたはおそらく切り替えたいが、Mavenのいないあなたはパス要素を構築するためのルールを含める使用することができますので、瓶で終わるディレクトリ内のすべてのものが**/*.jar

-1

だろうすべての依存関係を識別するのには非常に優れており、配布用にlib jarを一緒にコピーまたは結合するためのいくつかの機能を備えています。私の目的のために、ビルド時に実行スクリプトを作成するMavenプラグインがあります。このプラグインは私のクラスパスを設定しますので、心配する必要はありません。

+0

アイビーは、依存関係の管理を行うにはかなりアリ互換の方法です。 –

3

ant 1.7以降では、マニフェストクラスパスタスクが前進する方法です。 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> 
関連する問題