2017-06-19 6 views
1

実行時にファイルシステムからロードされる別のOSGi jarからクラスメソッドを実行する必要があるNetBeans OSGi mavenプロジェクトがあります。Java Maven OSGiファイルシステムからjarを動的にロードし、実行時にクラスメソッドを実行します。

私は、これらの似た質問のいくつかを見てみました:

  1. Dynamic loading of modules in Java

  2. Loading of OSGi bundle dynamically from a file system

  3. Looking for basic example of using Apache Felix in dynamic loading of Jar file and instancing a class at runtime in Java

  4. java: is there a framework that allows dynamically loading and unloading of jars (but not osgi)?

  5. How to dynamically load Java classes at Runtime in OSGI framework?

が、それらの非私はロードしていますバンドルにメソッドにアクセスすることができますどのように答えているようです。

彼らは私にバンドルのロード方法についての良い指示を与えるようですが、OSGiのドキュメントもそうです。私が見つけられなかったのは、私がインストールしたバンドルの特定のクラスから特定のメソッドを実行する方法です。リフレクションはうまくいかないようですが、それは良いアイデアではないかもしれないと私は読んで、いずれにせよそれは私に有名なClassNotFoundExceptionを与えます。

あり、この中に示すように、全体のマニフェストのインポートおよびエクスポートでもあるし、他の質問 OSGi: programmitically add imports to a bundle

私は、NetBeansを使用していますので、私はまた、私はそれが仕事をしていませんかどうかわからないんだけど、bndtoolsを使用することはできません。 OSGiサービスと何か関係があるかどうかもわかりません。私の髪を引っ張らないように私を助けて誰にも事前に

感謝:)

+0

私はNetBeans OSGIでしばらく働いていましたが、現在はIDEを手に入れていません。バンドルをNetBeansの依存関係として追加する必要があることを覚えておいてください。その後、好きなようにメソッドを呼び出すことができます。しかし、まず必要なパッケージをエクスポートする必要があります。 –

答えて

2

は、だから私はあなたがすでにロード仮定し、バンドルを開始しました。次のステップは、バンドルのクラスローダを得ることです:

このクラスローダを使用して
ClassLoader loader = bundle.adapt(BundleWiring.class).getClassLoader(); 

名前でクラスをロードし、その上でメソッドを呼び出すためにリフレクションを使用することができます。

また、これはOSGiにとって優れたアーキテクチャではないと考えてください。他のバンドルとクラスがすでにコンパイルされていることが分かっている場合は、単にImport-Packageを使用して、新しいクラスで他のクラスをインスタンス化します。

実行時に他のバンドルとクラスを認識していないが、すべてのバンドルソースを制御できる場合は、サービスアプローチを使用します。あなたは、バンドルによって共有される共通のインターフェースを持つことができます。もう一方のバンドルは、OSGiサービスとしての機能を提供し、共有インターフェースを使用してバインドしてアクセスすることができます。

+0

「足で自分を撃つにはどうすればいいの?」という質問をすると、足で自分を撃つ方法を実際に指示することは必ずしも良い考えではないかもしれません。 –

関連する問題