2014-01-14 95 views
0

我有一個子類引用一個不同包中的超類。我是否需要導出這兩個軟件包,以便將一個軟件包引用到子類中。OSGi超類的可見性

例如:

BundleOne exports packageB 
packageA: interface i 
packageB: abstract class B implements i 

BundleTwo imports packageB 
packageC: class C extends B 

這個例子並沒有爲我工作,和OSGi框架抱怨程序包A丟失的導入包約束。我覺得這很奇怪,因爲我沒有在C類中的任何地方引用它。

import-package聲明由maven插件自動構建,我認爲這是在後臺使用bnd。

回答

1

是的,你絕對必須導出這兩個軟件包。你爲什麼覺得這很奇怪?您確實參考包A中的接口I,因爲您參考的是B類,其中I

實際上,您的班級C也是I。爲了有機會構建您的類,Java虛擬機必須具有完整的超類層次結構的可見性。

+0

是的,的確如此。我猜想我沒有想到。所以我認爲,進口/出口必須一路走高,與層級一樣高。 – mhb

+0

是的。因爲所有超類型和聲明的接口都是該類型公共簽名的一部分。它們被這種類型「使用」,這就是爲什麼有使用限制的原因。 –

1

是的,您必須同時導出,B的類定義依賴於A,因此如果沒有A,您也不能引用B.

這將是一個類似於B.jar一個簡單的Java應用程序,其中包A是在a.jar文件和B在。如果在運行時,A.jar不可用,那麼由於部分定義缺失,您無法實現B.