2

これに対する私の最初の試みは、主なアプリケーションの一部として単に Jar を含めることでした。(Eclipse 3.7) これが嫌われていることは承知していますが、私はスタンドアロンの特殊なアプリを作成していて、バンドルを理解しようとすることについてあまり心配していませんでした。

これを実行しようとした:

 Reflections r = new Reflections("mypackage");

 Set<Class<?>> activeActions = r
                .getTypesAnnotatedWith(MyAnnotation.class);

スタンドアロンのテスト アプリでは問題なく動作しましたが、RCP で試してみると、次の出力が得られました。

org.reflections.ReflectionsException: could not create Vfs.Dir from url, 
no matching UrlType was found [bundleresource://1009.fwk651584550/]

either use fromURL(final URL url, final List<UrlType> urlTypes) 
or use the static setDefaultURLTypes(final List<UrlType> urlTypes) 
or addDefaultURLTypes(UrlType urlType) with your specialized UrlType.

だから私は答えを探して、私の問題をカバーしているが、それを解決するのに十分な詳細を私に与えていないこの質問を見つけました。最初のステップとしてリフレクション パッケージをバンドルに移動しましたが、実行するとまったく出力が得られません。リフレクション パッケージからのフィードバック。

my activeActions リストが空であるため、カスタム UrlType を作成するというソリューションの 2 番目の部分を実装していなかったため、スキャンが機能していません (期待していませんでした)。ただし、カスタム URL タイプを実装しましたが、まだ何も見つかりません。リフレクション パッケージからのフィードバックが表示されないため、理由がわかりません。何も見つからないだけです。

誰かが Reflections のログ記録を機能させるのを手伝ってくれて、UrlType ソリューションが機能しない理由を見つけてくれることを願っています。

編集

冗談です。バンドルを気にせず、リフレクション jar をクラスパスに押し込むだけで、カスタム UrlType が登録されていれば、スキャンが機能します。そして、ロギングはすべて機能します。なぜバンドルを気にする必要があるのですか?

4

1 に答える 1

0

OSGIフレームワークでのクラスのロードに関する問題のようです。各バンドル/プラグインは独自のクラスローダーを維持しているため、間違ったクラスローダーを使用してクラスをロードしていると、リソースが解決されないことを覚えておく必要があります。最初にOSGIでクラスをロードするために、これが推奨されるアプローチです。

このPlatform.getBundle( "com.mybundle.id");を実行して、クラスを含むバンドル/プラグインを取得します。バンドルインスタンスには、.loadClass(String class);というメソッドがあります。

先ほど述べたアプローチでMyAnnotation.classをロードしてみて、何が起こるかを確認してください。参照した投稿のeclipsebuddy-register機能は、マップしたデータクラスがバンドル内にあるOSGIでhibernateを使用する場合などに役立ちます。デフォルトでは、hibernateはClass.forname()を使用してクラスをロードし、エラーが発生します。そのマップされたクラスは、休止状態のlibバンドルのクラスパス上にありません。バンドルにhibernateプラグインへの依存関係を追加することは意味がないため、hibernateバンドルのマニフェストでeclipse-buddy-policy:registered(正確な構文では正しくない)を設定し、マップされたクラスを含むバンドルでhibernateを次のように登録します。バディと実行時に、Hibernateクラスローダーはバンドル内のすべてのクラスをそのクラスパスに配置します。

うまくいけば、これはあなたにクラスのロードのアイデアを与えるでしょう、それは問題のようです。= new()ではなくバンドルインスタンスからクラスをロードしてみてください。

于 2012-11-09T22:10:30.673 に答える