【问题标题】:OSGI - static method calls across bundlesOSGI - 跨包的静态方法调用
【发布时间】:2009-09-01 08:24:25
【问题描述】:

我有一个已使用 bnd 转换为 OSGI 包的 3rd 方 JAR。我需要调用以从我自己的包中使用它的代码如下所示:

ThirdParty.setRegKey(myRegKey);
ThirdParty thirdParty = new ThirdParty();
thirdParty.callMethod();

似乎给我带来问题的是第一行 - 静态方法调用。在 OSGI 容器之外,使用标准 JAR,这可以正常工作。然而,在 OSGI 内部,我在第 3 行收到一个错误,指出没有设置注册密钥。

这样跨包的静态方法调用是否存在任何问题?就好像静态上下文没有在包之间共享。

【问题讨论】:

    标签: java static osgi


    【解决方案1】:

    你调试过代码吗?由于您没有告诉我们您正在使用哪个 3rd-party 库并且我们不知道您的完整环境,因此可能是 setRegKey()callMethod() 正在尝试做一些不起作用的“智能”在 OSGi 中。

    JDBC 驱动程序管理器有这个问题,你的包导入了 JDBC 驱动程序类,但驱动程序管理器决定你的包中的调用线程不应该“看到”JDBC 驱动程序类,所以它在 OSGi 中运行时会失败。

    【讨论】:

      【解决方案2】:

      您可能需要导出/导入包含 ThirdParty 类的包。否则它最终会出现在不同包的不同类加载器中,因此它确实不是共享的。

      真正的 OSGi 方式是通过一些服务来做到这一点。

      【讨论】:

      • 感谢您的澄清。在第 3 方捆绑清单中,我有 Export-Package:com.thirdparty.package,然后在我的捆绑清单中,Import-Package:com.thirdparty.package。这是你的意思吗?
      • 示例代码表明MANIFEST的导入和导出是正确的,否则他将无法编译,并且所述的问题是第3行的运行时失败。
      • @William 是的。不过,如果您的代码都在一个包中,这应该不是问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      相关资源
      最近更新 更多