2011-07-10 1 views

答えて

37

-classpathオプションを使用してリソース(通常はjarファイル)を指定する順序で指定します。クラスパス上の '先の'リソースは、後に指定されたリソースよりも優先されます。これはアプリケーションのマニフェストファイルで設定することもでき、-classpathオプションを指定する必要はありません。マニフェストファイルの操作方法については、these articlesをチェックしてください。

「クラスが発見されたか」here見つけることができるの徹底的な説明、JAR-ファイルは検索のロジックを記述しJARクラスパスクラス上のセクション。リソースが配置される場所

+0

私がMavenを使用している場合、事実上ランダムであることを意味しますか?テスト時にMANIFEST.MFのクラスパスを設定することはできません(jarファイルはローカルリポジトリから取得されます) –

+0

Maven 2.0.9以降、これは[here](http://stackoverflow.com/questions/793054/)で説明されているように処理できます。 maven-classpath-order-issues)を参照してください。 – mouser

+1

クラスパス上の 'リソース 'がそれより後に指定されたリソースより優先されることを確認する正式な文書です.' –

7

クラスローダは、(クラスローダの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あなたの特定のケースでボンネットの下で起こっていることを追跡します。

+0

真ののは、クラスローダに依存しますが、標準のクラスローダでJava SEを使用しているので、もう1つの答えが適用されます。 –

+1

これは、通常のURLClassLoaderが使用され、複数のjars /ディレクトリがある場合に何が起こるかを追加するはずです。 –

関連する問題