クラスパスに同じ名前のファイルが複数ある場合(たとえば、.jar
にlog4j.properties
という複数のファイルがある場合)、JVMが選択するルールは何ですか?Java:クラスパスJVM上の複数のリソースのうち、どれがかかりますか?
答えて
-classpath
オプションを使用してリソース(通常はjarファイル)を指定する順序で指定します。クラスパス上の '先の'リソースは、後に指定されたリソースよりも優先されます。これはアプリケーションのマニフェストファイルで設定することもでき、-classpath
オプションを指定する必要はありません。マニフェストファイルの操作方法については、these articlesをチェックしてください。
「クラスが発見されたか」here見つけることができるの徹底的な説明、JAR-ファイルは検索のロジックを記述しJARクラスパスクラス上のセクション。リソースが配置される場所
クラスローダは、(クラスローダのJavaDocから取られた)を決定します。
ClassLoaderクラスは、クラスおよびリソースを検索するための委譲モデルを使用しています。 ClassLoaderの各インスタンスには、関連付けられた親クラスローダがあります。 ClassLoaderインスタンスは、クラスまたはリソースの検索を要求されると、クラスまたはリソース自体の検索を試みる前に、そのクラスまたはリソースの検索を親クラスローダに委譲します。 「ブートストラップクラスローダー」と呼ばれる仮想マシンに組み込まれたクラスローダーは、それ自体が親を持ちませんが、ClassLoaderインスタンスの親として機能します。 (Class.javaから取られた)
あなたのコードのクラスの#1のgetResourceまたはクラス#getResourceAsStreamには呼ばれてどこだから、この問題が発生した
public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
ClassLoader.java:
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
のClassLoader #findResourceは、ClassLoader実装によって実際に上書きされます。これはアプリケーションサーバTomCatで動作が異なること、またはjarファイルから実行している場合、現在使用している環境のClassLoader実装に依存することを意味します。
Hereあなたの特定のケースでボンネットの下で起こっていることを追跡します。
真ののは、クラスローダに依存しますが、標準のクラスローダでJava SEを使用しているので、もう1つの答えが適用されます。 –
これは、通常のURLClassLoaderが使用され、複数のjars /ディレクトリがある場合に何が起こるかを追加するはずです。 –
- 1. 複数のJVM上のAkka java threadsチョーク
- 2. Javaクラスパスのネットワークディレクトリからリソースを正しく読み込むにはどうすればよいですか?
- 3. デスクトップJVM上でNullPointerExceptionメッセージがどのように改善されますか?
- 4. Javaクラスパス(pentaho)の外部からリソースをロードする
- 5. 同じサーバー上の複数のJVM上でラクダエンドポイントがグローバルで共有されていますか?
- 6. ページ上の複数のドロップダウンからどれがドロップダウンされていますか?
- 7. Java JVMはどのように動作しますか?
- 8. 複数の条件のうちどれが真であるかを調べる
- 9. マッピング以上のどちらかが
- 10. これらのうち、どちらが優れたPHP関数ですか?
- 11. 同一のデータフォーム上に複数のピッカライタがありますか?
- 12. Silverlightにはどのようなリソースがありますか?
- 13. JVMの最適化はどこから始まりますか?
- 14. GAEプロジェクトのクラスパス上のXerces JARが「SAXParserFactoryImplが見つかりません」
- 15. JVMの速度を上げるにはどうすればよいですか?
- 16. Quartzの@DisallowConcurrentExecutionは複数のJVMで機能しますか?
- 17. JNIでCの複数のスレッドからjava関数を呼び出すとどうなりますか?
- 18. プロセスにOSX上のグラフィカルインタフェースがあるかどうかはどうすればわかりますか?
- 19. tKafkaInput:SLF4J:クラスパスに複数のSLF4Jバインディングが含まれています
- 20. クラスパスに複数のSLF4Jバインディングが含まれています
- 21. 複数のデータソース、複数のトランザクションマネージャ。どちらが使用されていますか?
- 22. JavaはどのようにJavaとリソースのディレクトリを区別しますか?
- 23. GNU Makeにはどのような優れたリソースがありますか?
- 24. AS3、Java、C++のどちらの方が似ていますか?
- 25. Java Webアプリケーションでクラスパス上のリソースを含む最も一般的な標準は何ですか?
- 26. Postfix:複数のドメインと複数のユーザーのどちらのオプションですか?
- 27. なぜ複数のjvmインスタンスが作成されるのですか?
- 28. gradleでJAVAクラスパスをどのように出力するのですか?
- 29. JVMオプション:どの値が渡されますか?
- 30. Android Java:複数のタスクが操作されているAsyncTaskはどうなりますか?
私がMavenを使用している場合、事実上ランダムであることを意味しますか?テスト時にMANIFEST.MFのクラスパスを設定することはできません(jarファイルはローカルリポジトリから取得されます) –
Maven 2.0.9以降、これは[here](http://stackoverflow.com/questions/793054/)で説明されているように処理できます。 maven-classpath-order-issues)を参照してください。 – mouser
クラスパス上の 'リソース 'がそれより後に指定されたリソースより優先されることを確認する正式な文書です.' –