2

クラスパスでリソースを検索した後、次の URL を取得しました。

bundleresource://23.fwk1186515174/com/google/inject/Injector.class

どのバンドルでリソースが提供されたかを調べるにはどうすればよいですか?

[編集]クラスパスに重複したクラスがある問題をデバッグしようとしています。私が使用しているコードは次のとおりです。

private void debugClassPath() {
    String resource = "com/google/inject/Injector.class";
    try {
        Enumeration<URL> urls = getClass().getClassLoader().getResources( resource );

        while( urls.hasMoreElements() ) {
            System.out.println(urls.nextElement());
        }

        System.out.println("---");

        urls = XtextRunner.class.getClassLoader().getResources( resource );

        while( urls.hasMoreElements() ) {
            System.out.println(urls.nextElement());
        }
    } catch( IOException e ) {
        e.printStackTrace();
    }
}

これにより、いくつかの URL が得られるcom.google.inject.Injectorので、どのバンドルがそれらをクラスパスに追加するかを調べたいと思います。

4

3 に答える 3

0

厄介な方法の1つは、URLを解析することですが、これはEquinoxで実行している場合にのみ機能します。BundleResourceHandlerのソースによると、URLスキームの右側にある整数( '23')がバンドルIDです。BundleContextがある場合(アクティベーターを確認してください)、getBundle(long)を使用して、これがそのIDを持つバンドルを見つけることができます。

ただし、これを行うにははるかに優れた方法がある可能性があります。クラスパスでリソースをどのように検索しますか?

于 2012-08-09T16:10:18.477 に答える
0

OSGi URL は階層を保証します。そのため、リソースをマニフェスト (またはテキスト ファイル)に置き換えcom/google/inject/Injector.classて読み取るだけです。META-INF/MANIFEST.MFそこにある情報は、あなたが見ているバンドルを教えてくれます。

クラスの重複は、悪い(非常に悪い私見)慣行と見なされる分割パッケージでのみ発生する可能性があります。OSGi では、分割パッケージにはRequire-Bundle再エクスポートまたはBundle-Classpath. これらがなければ、人生ははるかに簡単です...

于 2012-08-13T07:32:20.783 に答える
0

これを行う標準的な方法はありません。ただし、Equinox の場合、URL ハンドラーがオーソリティでエンコードする方法を確認することによる実装固有の方法があります (これは実装固有の方法であるため、将来のリリースで変更される可能性があります)。

于 2012-08-09T17:04:24.003 に答える