2012-12-13 113 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也需要访问这些类型。 –