2017-06-19 24 views
2

ClassPath要素のみを含むJARを使用してJavaアプリケーションのクラスパスを構築すると、私は奇妙な動作に遭遇しました。ClassPath要素に記載されているJARからクラスをロードできますが、欠けている。JARからクラスをロードできますが、リソースをロードできないのはなぜですか?

例:私のfull-classpath.jarは、通常のコンテンツと、このラインでちょうどMETA-INF/MANIFEST.MFが含まれています

ClassPath: foo-service.jar bar-service.jar service-main.jar 

service-main.jarcom.pany.project.Mainが含まれています。

java -cp full-classpath.jar com.pany.project.Mainを実行すると、それが動作します。

しかしfoo-service.jarbar-service.jarは、私はMavenのユニットテストからjava.util.ServiceLoaderを呼び出すと、それはfoobarサービスの両方を見ることができますMETA-INF/services/....

でサービス定義が含まれています。私がjava -cp full-classpath.jar com.pany.project.Main -service fooになると、ログに空のサービスリストが表示されます。

さらに悪いことに、私がMain.class.getClassLoader().getResources("META-INF/MANIFEST.MF")と呼ぶと、full-classpath.jarからマニフェストのみが得られます。他の3つのJARからのマニフェストファイルが見つからないので、これらのJARからクラスをロードできるので意味がありません。私はクラスパス全体を手動で構築するときにも動作します。 full-classpath.jarClassPath要素を使用すると失敗します。

何が間違っている可能性がありますか、これをどのようにデバッグすることができますか?私は、Java 8

答えて

0

Class-Pathsun.misc.URLClassPath.JarLoader.parseClassPath(URL, String)で処理されたマニフェスト属性を使用してい

。このメソッドはsun.misc.URLClassPath.JarLoader.getClassPath()から1回呼び出されます。

 if (index != null) { 
      return null; 
     } 

     if (metaIndex != null) { 
      return null; 
     } 

意味:getClassPath()の開始時に、あなたはこのコードを見つけることができ、あなたのクラスパスのJARは、インデックスまたは「メタインデックス」(つまり、何でも)が含まれている場合、Class-Path属性は無視されます。

JavaがまだClass-Path属性に記載されているJARからクラスをロードできるのはわかりませんが、インデックスを削除するとリソースの読み込みの問題が修正されます。

関連する問題