1

複雑なアプリケーション (jForexAPi、DDS2) を OSGi バンドルに入れようとしています。コンパイル時と実行時 (推移的) の両方の依存関係が組み込まれた 2 つのバンドルを作成しました。したがって、.jar バンドル内に .class-es を含むバンドルがあります。

DDS2実装は実行時にスレッドのクラスローダーを介してクラスをロードするため、使用しようとするとClassNotFoundExceptionが発生しました。どういうわけかこのように:

           Class e = Thread.currentThread().getContextClassLoader().loadClass("com.dukascopy.charts.main.DDSChartsControllerImpl");

2 つの質問があります。

  1. karaf でスレッドの親バンドルを特定するにはどうすればよいですか?
  2. OSGi のランタイム クラスロードなどの問題を解決するにはどうすればよいですか? 実行時のクラスロードを許可または検出する方法はありますか?
4

1 に答える 1

2

karaf でスレッドの親バンドルを特定するにはどうすればよいですか?

それはいけません。スレッドに親バンドルがありません。Thread コンテキスト クラスローダを意味する場合、OSGi ではまったく定義されていません。TCC は通常、Java EE の世界では webapp のクラスローダーです。ただし、OSGi では、null でも何でもかまいません。絶対に使用しないでください。

OSGi のランタイム クラスロードなどの問題を解決するにはどうすればよいですか? 実行時のクラスロードを許可または検出する方法はありますか?

次の 2 つのことを行うことができます。

  • プロジェクトに貢献して、これらのクラスをロードするために使用されるクラスローダーの構成を許可します
  • 回避策の実装: ClassNotFoundException のスタックトレースを分析し、スレッド コンテキスト クラスローダーを設定できる場所を見つけます。

2 番目のオプションを選択した場合、コードは次のようになります。

Thread currentThread = Thread.currentThread();
ClassLoader previousCL = currentThread.getContextClassLoader();
try {
    currentThread.setContextClassLoader(DDSChartsControllerImpl.class.getClassLoader());
    callNextFunctionOnStacktrace();
} finally {
    // You should set the original CL back as other technology might use the TCC tricks, too
    currentThread.setContextClassLoader(previousCL);
}
于 2015-01-03T20:38:01.737 に答える