アプリケーションのクラスパスを取得しようとしています。
私はjar(application.jarという名前)を持っており、そのManifest.mfに。のような他のjarファイルがありますClass-Path: a.jar b.jar
。
System.getProperty("java.class.path")
jarを使用すると、 a.jarとb.jarが表示されないのはなぜですか?
アプリケーションのクラスパスを取得しようとしています。
私はjar(application.jarという名前)を持っており、そのManifest.mfに。のような他のjarファイルがありますClass-Path: a.jar b.jar
。
System.getProperty("java.class.path")
jarを使用すると、 a.jarとb.jarが表示されないのはなぜですか?
java.class.path
これは、がクラスパス環境変数($CLASSPATH
または)から設定されるシステムプロパティであるという事実と関係がある可能性があります-classpath
。これらは、-jar
オプションが使用されている場合は無視されます。
ドキュメントによるjava -jar
と、そのjarオプションを使用してアプリケーションを実行すると、マニフェストのみClass-Path
が考慮され、他の設定は無視されます。http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.htmlから:
-jar
JARファイルにカプセル化されたプログラムを実行します。最初の引数は、スタートアップクラス名ではなくJARファイルの名前です。このオプションを機能させるには、JARファイルのマニフェストにMain-Class:classnameという形式の行が含まれている必要があります。ここで、classnameは、アプリケーションの開始点として機能するpublic static void main(String [] args)メソッドを持つクラスを識別します。JarファイルとJarファイルマニフェストの操作については、JarツールのリファレンスページとJavaチュートリアルのJarトレイルを参照してください。
このオプションを使用すると、JARファイルがすべてのユーザークラスのソースになり、他のユーザークラスパス設定は無視されます。
それはまさに私がやってきた質問でもあります。使用している場合でも、プロパティ java -cp ..;myTest.jar test2.Needer
の結果として「..;myTest.jar」しか取得されません。java.class.path
注:-cp
パラメーターを使用する場合でも、で指定されたクラスパスMANIFEST.MF
が検索されます。(グーグルでこの情報を見つけることができず、自分でテストしました)
ですから、それはパラメータとは関係がないと思い-jar
ます。リンクであなたは見つけることができます
ワイルドカードの展開は、クラスのロードプロセス自体の後半ではなく、プログラムのmainメソッドの呼び出しの前に早期に実行されます。
興味深いことに、テスト中に次のことがわかりました。MANFIFEST.MFのクラスパスが再帰的に検索されます。したがってtest.jar
、myTest.jarのMANIFEST.MFのクラスパスに特定のファイルがある場合、test.jarのMANIFEST.MFのクラスパスも検索されます(を使用する場合java -cp "myTest.jar" test2.Needer
)。
その結果、java.class.path
プロパティがMANIFEST.MFのクラスパスの表示をサポートする場合、その後に依存するすべての.jarファイルのクラスパスも表示する必要があります。クラスパスはクラスが見つかるまで検索されるだけなので、これは遅延読み込みメカニズムをうまく参照できません。
TL; DR-jar
:これはパラメータとは何の関係もないと思います(-cp
同様に関係します)。私の説明では、MANIFEST.MFからのクラスパスの表示のサポートには、追加の無意味な再帰的検索コストのみが含まれます(実際の依存関係は必要ないため、それぞれ.jarから使用されるものです)。また、この無意味な検索はプログラムの開始を遅らせるため(再帰検索は非常に深くなる可能性があるため)、実装されていません。