2009-08-11 8 views
3

ライブラリとしてパッケージ化されたクラスファイルにアクセスしようとしていますが、残念ながらjarライブラリは別のjarファイルにパッケージ化する必要があります。別のjarファイルにあるjarライブラリ内にあるクラスファイルを呼び出すことはできますか?

たとえば、いくつかのクラスライブラリを含むa.jarがあります。私は外部Javaアプリケーションからjarファイル内のクラスを呼び出す(インポートする)ことができます。今、このa.jarを別のjarと言うb.jarの中に入れ、b.jarの外側からa.jarのクラスにアクセス(インポート)する必要があります。

This is not the thing I want to do :)

+0

他の瓶が入っている瓶を作ったことを意味しますか?または、あなたはあなたの瓶に依存する瓶を入れたいと思っていますか?何が問題なのですか? – djna

+0

私は質問を更新しました:) –

答えて

6

あなたは対処することができたクラスローダ記述する必要があります「瓶内のjarファイルを。」これは私にとってかなり悪い考えのように聞こえる。

jarファイルをマージしないでください。ディスク上に別々に置いてください。ファイルを増やす必要性を管理する必要があるかもしれないが、実際にはすべてをより簡単にする予定です。クラスローダーを書くことは自明ではありません...

+0

+1「jars within Jars」は悪い考えです。 –

1

多分私は正しく理解していませんが、私はあなたのクラスパス上の他のJARファイルでプログラムを実行することを望んでいると思います。

ここで、A.jarにコアがあり、B.jarにライブラリがいくつかあるとしましょう。

main.class.Nameがあなたのメインクラスの名前で、あなたのコマンドライン引数のすべてがどこに行く argsがある
java -cp A.jar:B.jar main.class.Name args 

:;:あなたは、この(Windows上で置き換える)のようなプログラムを実行する可能性があります。

ます。また、このようなあなたのmanifest.mfMain-ClassClass-Path属性を置くことができます。

Class-Path: B.jar 
Main-Class: main.class.Name 

は、その後、あなたがこのようなプログラムを実行することができます。

java -jar A.jar args 

はあなたに真実を伝えるために、私が使用しました私のアプリケーションを1つのJARファイルとして配布し、すべての依存関係を1つの巨大なJARファイルに展開してラップするのはすばらしかったと思います。問題はいくつかのアプリケーションがかなりの依存関係で終わることで、私のコードに変更するたびに、依存関係の何も変更されていなくても、すべての依存コードを配布しなければならないということでした。これは、些細な変更だけであっても、巨大なJARファイルを配布することを意味していました。

マニフェスト属性を使用することで、単一のJARファイルと全く同じ方法で実行できるアプリケーションを配布することができます(一部のシステムでダブルクリックするか、単純な "java -jar")。後続のソフトウェアリリースで複製ライブラリのすべてを転送しないことで、時間と帯域幅を節約できます。

依存するJARをそれぞれ独自のディレクトリに置くこともできます(今はlibとしましょう)。Class-Pathを変更して、すべてのJARパスが "lib/B.jar"のようにします。そうすれば、多くの小さなJARファイルでいっぱいになっているメインプログラムのディレクトリに終わることはありません。

+0

問題は、OPに別のjarファイル*が1つ入っていることです。 –

+0

私は、質問のタイトルを再読することでより明確になると思いますが、質問のテキスト自体からではありません。 –

+0

私は質問を更新します:) –

関連する問題