【问题标题】:Transitive dependencies in OSGiOSGi 中的传递依赖
【发布时间】:2012-12-13 23:20:00
【问题描述】:

我在运行时收到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 中的类,而后者又调用 A 中的类时,就会发生异常。基于控制台,我可以看到 BundleClassLoader 在 bundle 3 中寻找类(换句话说,在它本身),但不是在它会找到它的 Bundle 1 中。如果我强制 BND 在 Bundle 3 中导入 A 一切正常,但它看起来太费力了。我觉得我错过了一些东西。 Equinox 不应该使用清单中的信息来设置捆绑类路径吗?或者在最坏的情况下,BND不应该检测3对1的依赖并在3的清单中导入包A吗?

我所有的捆绑包都是active,我没有uses 约束违规

【问题讨论】:

    标签: java osgi bnd


    【解决方案1】:

    Bundle 2 也必须导入 A。使用 A 表示任何导入我的 B 并导入 A 的包必须导入与我相同的 A。由于捆绑包 2 不导入 A,因此这是行不通的。另外,bundle 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等??听起来很不方便
    • 是的,这听起来很不方便,所以你可能不应该这样设计你的包。请记住,uses 约束仅存在,因为包 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,因为您的包也需要访问这些类型。
    • @NeilBartlett 感谢您提供的信息。我不知道只有当它在公共接口中公开而不是在内部使用时才公开。但是,您最后的评论使我感到困惑。你说 BND 应该检测像我的问题中这样的案例吗?它没有。也许我误解了你的评论??
    • 是的...如果您使用包,那么 bnd 会将其添加到Import-Package。你真的用 bnd 构建了所有这些包吗?你能更详细地描述你的问题吗?
    猜你喜欢
    • 2014-12-20
    • 2012-10-09
    • 2017-07-27
    • 1970-01-01
    • 2017-03-11
    • 2018-07-06
    • 2021-07-26
    • 2015-10-03
    相关资源
    最近更新 更多