2012-12-13 5 views
3

런타임시 NoClassDefFoundError이 발생하고 "uses" 지시어가 이것을 피할 것이라고 생각했습니다. 번들 3 차례에 의 클래스를 호출합니다 B의 클래스를 호출을 할 때OSGi의 이행 적 종속성

Bundle 1 
    Export-package A 

Bundle 2 
    Export-package B, uses "A" 
    Import-package A 

Bundle 3 
    Import-package B 

이제 예외가 발생합니다 여기 내 구성입니다. 콘솔을 기반으로, 나는 BundleClassLoader 번들 3 (즉, 그 자체로)에서 클래스를 찾지 만 찾을 수있는 번들 1에는없는 것을 볼 수 있습니다. 내가 번들 3에서 B를 가져 오도록 강제하면 모든 것이 잘 작동하지만 너무 많은 노동력을 소모합니다. 나는 뭔가를 놓치고있는 것처럼 느낀다. 매니페스트의 정보를 사용하여 번들 클래스 경로를 설정하지 않아야합니까? 또는 최악의 경우, BND가 3 대 1의 종속성을 감지하고 패키지 A를 3의 목록에 포함 시켜서는 안됩니까?

내 모든 번들 active하고 난 더 uses 제약 조건 위반이 없습니다 또한 수입 답은을 사용해야 2도 내 B를 수입하고 번들 A는 나와 같은를 가져와야합니다 수입 말한다

답변

1

번들. 번들 2는 A를 가져 오지 않으므로이 기능은 작동하지 않습니다. 또한 번들 3은 A가 B를 사용하기 때문에 A를 가져와야합니다. B의 모든 수입자는 A의 사용자이기 때문에 A를 가져와야합니다.

+0

미안하지만, 나는 2를 가져 왔습니다. 질문을 업데이트합니다. 두 번째 부분은 제가 찾고 있던 대답입니다. 그러나 A -> B, B -> C, C -> D, D -> E ....라면 A는 B, C, D, E를 가져올 필요가 있음을 의미합니다. B는 C, D, E를 가져와야합니다. C는 D, E 등을 가져올 필요가 있습니까 ?? 매우 불편한 것 같습니다. – Hilikus

+1

예, 불편한 소리가 들리므로, 그렇게 꾸러미를 디자인하면 안됩니다. 'uses' 제약 조건은 패키지 B가 공용 인터페이스에서 직접 A를 노출하기 때문에 존재한다는 것을 기억하십시오. 메서드 매개 변수로. 내부 사용은 사용 제한 조건을 작성하지 않습니다. 반면에 이런 패키지를 디자인한다면, bnd는이를 감지하고 필요한 모든 수입품을 만들고 제약 조건을 사용해야합니다. –

+0

필요합니다. 구체적인 예를 들어, javax.servlet.http.HttpServlet에 대해 생각해보십시오. javax.servlet.GenericServlet은 javax.servlet.Servlet을 구현합니다. 이것은 javax.servlet.http가 javax.servlet을 사용하는 명백한 사례입니다. 따라서 번들이 http 서블릿을 구현한다면 분명 javax.servlet.http를 가져와야합니다. 그러나 번들에서도 이러한 유형에 액세스해야하기 때문에 javax.servlet을 가져와야합니다. –