【问题标题】:OSGi Import Package issuesOSGi 导入包问题
【发布时间】:2023-04-08 03:48:02
【问题描述】:

我正在开发一个包含一些第三方依赖项的捆绑包。该捆绑包引用来自该第三方的两个不同 jar 的核心和连接功能。

然后我使用 maven-bundle-plugin 执行 Import-Package 我只能从任何 jar 中使用一个导入包,而不是同时使用两者(参考其他线程并且无法清楚地了解JAR 导入)。还是第三方的包组织有问题?

JAR A -> 包 -> com.test.pkg [包含 class1, class2] JAR B -> 包 -> com.test.pkg [包含 class3]

Import-package 导入 com.test.pkg,但我的应用程序需要 class3,并且在运行时我的容器在引用 class3 时抛出 ClassDefNotFoundException。不确定我是否理解错误。

POM sn-p 如下

<Import-Package>*,com.test.pkg</Import-Package>

有没有办法告诉我的 OSGi 容器从特定 JAR 中获取包?

【问题讨论】:

    标签: java noclassdeffounderror osgi-bundle maven-bundle-plugin


    【解决方案1】:

    这被称为“拆分包”,这就是为什么在 OSGi 中将包名称复制到多个包中是一种不好的做法。

    有几种方法可以解决您的问题。最简单的方法是将两个 3rd 方 jar 打包到一个新的 jar 中,然后从 uber-jar 导出您需要的内容。您可以将 jar 解压到源文件夹中,或者将原始 jar 包含在 lib 文件夹中。然后包含一个清单,用于导出您需要的内容。

    如果您只需要将 OSGi 客户端绑定到其中一个 jar,则可以使用 require-bundle 而不是 import-package。这不是最佳设计,因为它会强制您指定捆绑包而不是包,但有时它是最佳选择。

    最后,您可以使用 split-package 指令来更好地控制绑定过程。如果您不想使用更新的清单重新打包 3rd 方 jar,则必须创建一个片段包以在此处指定拆分包指令。

    【讨论】:

    • 是的,我用唯一的包名重新打包了来自 OSS 的代码,这似乎解决了这个问题。从新捆绑包中导出所需的包。它有帮助。
    猜你喜欢
    • 2016-09-15
    • 2017-04-07
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2012-02-02
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多