2017-06-19 68 views
1

我有一個NetBeans OSGi maven項目,需要從運行時從文件系統加載的另一個OSGi jar運行一個類方法。Java Maven OSGi從文件系統動態加載jar,並在運行時從其運行類方法

我試圖尋找其中的一些similiar問題:

  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?

,但他們似乎不回答我怎麼能在我加載捆綁訪問的方法。

他們似乎給我一個關於如何加載bundle的好方向,但OSGi上的文檔也是如此。我沒有找到的是如何從我安裝的軟件包中的特定類運行特定的方法。反射似乎沒有工作,我已經讀過,它可能不是一個好主意,並在任何情況下,它給了我着名的ClassNotFoundException。

還有整個清單進出口如圖所示在這方面和其他問題 OSGi: programmitically add imports to a bundle

我不能使用bndtools,因爲我使用NetBeans,我也不敢肯定,如果它的工作。我也不確定OSGi服務是否與它有關。

在此先感謝任何人幫助我,不要拉我的頭髮了:)

+0

我已經與NetBeans OSGI合作了一段時間,但現在沒有IDE。我記得你必須在NetBeans中添加這個包作爲依賴包,然後你可以隨意調用這些方法。但是你應該先導出所需的軟件包。 –

回答

2

所以我假設你已經加載並開始了捆綁。下一步是讓捆綁的類裝載器:

ClassLoader loader = bundle.adapt(BundleWiring.class).getClassLoader(); 

使用這個類加載器可以按名稱和使用反射加載類調用的方法就可以了。

另請注意,這不是一個好的OSGi體系結構。如果你在編譯時已經知道其他bundle和class,那麼只需使用Import-Package並用new來實例化另一個類。

如果您在運行時不知道其他軟件包和類,但是可以控制所有軟件包源,則使用服務方法。你可以有一個共同的接口共享的捆綁。另一個bundle可以提供其作爲OSGi服務的功能,然後您可以使用共享的接口進行綁定和訪問。

+0

當問題問「我如何在腳下自我射擊」時,實際指導如何在腳下自我射擊可能並不總是一個好主意。 –