Java OSGi中的可传递依赖关系

Java OSGi中的可传递依赖关系,java,osgi,bnd,Java,Osgi,Bnd,我在运行时遇到了一个NoClassDefFoundError,我认为“uses”指令可以避免这种情况,因为我认为它创建了传递性(如果我错了,请纠正我)。 以下是我的配置: Bundle 1 Export-package A Bundle 2 Export-package B, uses "A" Import-package A Bundle 3 Import-package B 现在,当Bundle 3调用B中的类,而B中的类又调用a中的类时,会发生异常。基于控制台,我

我在运行时遇到了一个
NoClassDefFoundError
,我认为
“uses”
指令可以避免这种情况,因为我认为它创建了传递性(如果我错了,请纠正我)。 以下是我的配置:

Bundle 1 
  Export-package A

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

Bundle 3
  Import-package B
现在,当Bundle 3调用B中的类,而B中的类又调用a中的类时,会发生异常。基于控制台,我可以看到
BundleClassLoader
在Bundle 3中查找该类(换句话说,它本身),但在Bundle 1中找不到该类。如果我强制BND在Bundle 3中导入一个包,一切正常,但看起来太劳动密集了。我觉得我错过了什么。equinox不应该使用清单中的信息来设置包类路径吗?或者在最坏的情况下,BND不应该检测到3对1的依赖性并在3的清单中导入包A吗


我的所有捆绑包都是
活动的
,我没有
使用
违反约束

捆绑包2还必须导入A。使用A说明导入我的B和导入A的任何捆绑包都必须导入与我相同的A。由于bundle 2不导入文件,因此这不起作用。另外,捆绑包3需要导入A,因为B使用A。B的任何导入者也是A的用户,因此必须导入A。

对不起,我确实在2中导入了A,我错过了它。将更新问题。你的第二部分是我一直在寻找的答案。但这是否意味着如果A->B,B->C,C->D,D->E。。。。然后A需要导入B,C,D,E;B需要进口C、D、E;C需要导入D、E等??听起来很不方便,所以你可能不应该这样设计你的软件包。请记住,
使用
约束只存在于包B直接在其公共接口中公开A,例如作为方法参数。内部使用不创建使用约束。另一方面,如果您这样设计包,bnd应该检测到这一点,并创建所有必需的导入和使用约束。这是必要的。对于一个具体的例子,请考虑javax.servlet.http.HttpServlet扩展javax.servlet.GenericServlet实现javax.servlet.servlet。这是javax.servlet.http使用javax.servlet的明显例子。因此,如果捆绑包实现了HTTPservlet,那么显然需要导入javax.servlet.http。但是您还需要导入javax.servlet,因为您的包还需要访问这些类型。@NeilBartlett感谢您提供的信息。我不知道它只是在公开界面中公开的,而不是在内部使用。然而,你最后的评论把我弄糊涂了。你说BND应该发现像我问题中那样的病例?没有。也许我误解了你的评论??是的,确实。。。如果您使用软件包,bnd会将其添加到导入软件包中。你真的用bnd构建了所有这些包吗?你能更详细地描述一下你的问题吗?