2012-12-13 111 views
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約束違規

回答

1

包2還必須導入答:使用一說,那我的進口B以及任何捆綁進口必須導入相同的A作爲我。由於bundle 2不會導入A,因此這不起作用。此外,捆綁3需要導入A,因爲B使用A.任何B的進口商也是A的用戶,因此必須導入A.

+0

對不起,我確實在2中輸入了A,我錯過了它。將更新問題。你的第二部分是我正在尋找的答案。但這是否意味着如果A→B,B→C,C→D,D→E ....那麼A需要導入B,C,D,E; B需要導入C,D,E; C需要導入D,E等?這聽起來很不方便 – Hilikus

+1

是的,這聽起來不方便,所以你可能不應該這樣設計你的包。請記住,只有「使用」約束存在,因爲包B直接在其公共接口中公開接口A,例如作爲方法參數。內部使用不會創建使用約束。另一方面,如果你這樣設計你的軟件包,bnd應該檢測並創建所有必需的導入並使用約束。 –

+0

這是必要的。有關具體示例,請考慮javax.servlet.http.HttpServlet擴展javax.servlet.GenericServlet實現javax.servlet.Servlet。這是javax.servlet.http使用javax.servlet的一個明顯例子。所以如果你的bundle實現了一個http servlet,你顯然需要導入javax.servlet.http。但是你也需要導入javax.servlet,因爲你的bundle也需要訪問這些類型。 –