3
我在運行時得到了NoClassDefFoundError
,我認爲"uses"
指令會避免這種情況,因爲我認爲它創建了傳遞性(如果我錯了,請糾正我)。 這裏是我的配置:現在OSGi中的傳遞依賴關係
Bundle 1
Export-package A
Bundle 2
Export-package B, uses "A"
Import-package A
Bundle 3
Import-package B
,在發生異常時捆綁3使得乙這反過來又使得一個一類調用類的調用時。基於控制檯,我可以看到BundleClassLoader
在捆綁包3中查找類(換句話說,本身),但不能在捆綁包1中找到它。如果我強迫BND在Bundle 3中導入A,一切正常,但它看起來勞動強度很大。我覺得我失去了一些東西。不應該equinox使用清單中的信息來設置bundle classpath?或者在最壞的情況下,BND不應該檢測到3對1的依賴關係,並且在3的清單中導入包A?
我所有的包都是active
我沒有uses
約束違規
對不起,我確實在2中輸入了A,我錯過了它。將更新問題。你的第二部分是我正在尋找的答案。但這是否意味着如果A→B,B→C,C→D,D→E ....那麼A需要導入B,C,D,E; B需要導入C,D,E; C需要導入D,E等?這聽起來很不方便 – Hilikus
是的,這聽起來不方便,所以你可能不應該這樣設計你的包。請記住,只有「使用」約束存在,因爲包B直接在其公共接口中公開接口A,例如作爲方法參數。內部使用不會創建使用約束。另一方面,如果你這樣設計你的軟件包,bnd應該檢測並創建所有必需的導入並使用約束。 –
這是必要的。有關具體示例,請考慮javax.servlet.http.HttpServlet擴展javax.servlet.GenericServlet實現javax.servlet.Servlet。這是javax.servlet.http使用javax.servlet的一個明顯例子。所以如果你的bundle實現了一個http servlet,你顯然需要導入javax.servlet.http。但是你也需要導入javax.servlet,因爲你的bundle也需要訪問這些類型。 –