我有以下情況。我的應用程序中需要一個類 A 的實例,該類 A 來自捆綁包 B (osgi),位于該捆綁包中的包 X 中。到目前為止我所做的:我已將捆綁包 B 添加到本地 Maven 存儲庫,并將其作為“提供”范圍的依賴項添加到我的 pom 中。我還添加了 Bundle B 中的包 X,其中 A 類駐留在我的 pom 中,并在 pom.xml 中使用動態導入。這里需要注意一件事 - 包 X 不是從包 B 導出的,但我知道它仍然可以工作,我見過同事這樣做,但我還沒有那么好。無論如何,我如何嘗試獲取以下類的實例:Bundle bundle;Class<?> checkClass=bundle.loadClass("full path to class A");TypeOfClassA newClass=checkClass.newInstance();我在這里得到:java.lang.ClassNotFoundException ClassA not found by myapplicationat org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)在org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)但為什么 ?我已經加載了 jar,我正在使用捆綁類加載器,而且如果我將 checkClass 轉換為 Object,我可以看到 Class A 的方法和字段,所以看起來不錯,我如何獲取 A 類的實例?
2 回答

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
在 OSGi 中,編譯時和運行時之間存在差異。在編譯時,您會看到自己的 jar 的類以及來自 Maven 的所有依賴項。
在運行時,bundle 默認只看到它自己的類。任何其他包都需要清單中的 Import-Package 語句。通常,當您使用類時,bnd 會自動創建它。只要有可能,你就應該依賴這種自動性。
當然,您的情況有所不同,因為您要訪問的包不是由捆綁包 B 導出的。在這種情況下,無法通過您自己的捆綁包的捆綁包類加載器訪問類 A。
相反,您需要使用捆綁包 B 的捆綁包類加載器。例如,您可以從 BundleContext 獲取捆綁包 B。然后就可以加載類了。
另一種選擇是使用從 Bundle B 導出的類 C,并使用類 C 的類加載器來加載類 A。
無論如何,這是一個黑客行為。您應該避免使用另一個包的私有類。

狐的傳說
TA貢獻1804條經驗 獲得超3個贊
當你編寫類似的東西 PluginA test=(PluginA) classloader.loadclass("PluginA").newInstance()
時,你需要實際導入 PluginA 類,正如 Christian 提到的,只有從它所在的包中導出它才可能。以下應該可以工作:
Object test= classloader.loadclass("PluginA").newInstance()
然后,您將需要使用反射來訪問類的方法等。
添加回答
舉報
0/150
提交
取消