2017-02-21 3 views
0

私はVirgo-Tomcat-Serverを実行しています。そのキーをマップからOSGi:他のバンドルのClassloaderを取得する方法

bundle.a.MyEnum 

コンテキスト

bundle.b 

を介して受信し、SpelExpressionParserを使って春の式言語され、サンプルの表現は、「取得(T(bundle.aだろうEnumMapがあり、 .MyEnum).SAMPLEKEY) "パーサー(それぞれのTypeLocator)は、bundle.aのClassLoaderにアクセスする必要があります。

だから私はやった:

TypeLocator typeLocator = new StandardTypeLocator(getBundleAClassLoader()); 
StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); 
evaluationContext.setTypeLocator(typeLocator); 
spelExpressionParser = new SpelExpressionParser(); 
spelExpressionParser.parseExpression(expression)).getValue(evaluationContext, context); 

質問はbundle.bのクラスでbundle.aのクラスローダを取得するための適切な方法は何か、ですか? は試みのカップルの後、私が見つけた唯一の作業溶液は次のとおりです。

private static ClassLoader getBundleAClassLoader() { 
    MyEnum bundleARef = MyEnum.SAMPLEKEY; 
    return bundleARef.getClass().getClassLoader(); 
} 

編集:ソリューション

getBundleAClassLoader() 

が正常に動作します

TypeLocator typeLocator = new StandardTypeLocator(this.getClass().getClassLoader()); 
必要はありません。

答えて

1

これはあまりにも複雑です。 bundle.bのマニフェストでImport-Packageを実行するだけで、自分のタイプと同じ方法でタイプにアクセスできます。

+0

bundle.bの輸入bundle.a、しかしStandardEvaluationContextことなく、春クラスSpelParserExpressionはbundle.b輸入場合にClassNotFoundException – pma

+0

もたらすbundle.bのClassLoaderを使用しますMyEnumのパッケージ、次にbundle.bのクラスローダーがクラスbundkle.a.MyEnumを見つけます –

+0

私は修正された、それは動作します。私がthis.getClass()。getClassLoader()を試したときに、TypeLocatorが正しく設定されていなかったと思います。ありがとう! – pma

1

SomeClassOfBundle.class.getClassLoader() 

又は

bundle.adapt(BundleWiring.class).getClassLoader() 
+0

私は最初の提案を試したが、うまくいかなかった。私はバンドルb = bundleContext.getBundle()を使用して2番目のバンドルを試してみました。これはbundle.bという結果になり、ClassLoaderになります。おそらく私は代わりにgetBundles()を使用し、正しいものを取得する必要があります。 – pma

+0

「うまくいかない」とはどういう意味ですか?バンドル配線エラー?最初のアプローチを使用する場合は、SomeClassOfBundleパッケージのマニフェストファイルにImport-Packageが必要です。 – Puce

+0

私は昨日テストされた最初のアプローチを持っていて、ClassNotFoundExceptionを受け取りました。しかし、私は再びそれをテストし、それは働いた。私は彼の答えを受け入れましたが、それにもかかわらずありがとうございました。 – pma

関連する問題