在 OSGI 中导入内部包



我最近开始将现有的 maven 项目转换为 OSGI 捆绑包,并且对我需要在 POM 文件的<Import-Packages>标签中列出的所有内容感到困惑。

最初,我放了一个星号来查看OSGI认为需要的所有内容,并且惊讶地发现它列出了来自同一项目的软件包。我在网上环顾四周,但无法找到是否需要导入内部软件包以及不这样做是否可能出现潜在问题的明确答案。

我是否需要在项目中列出<Import-Packages>中使用的软件包,如果是这样,为什么对我来说似乎没有必要。

我在 POM 中使用以下插件:
<groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId>

这是 tx 核心的结果 pom。所有 tx-core.* 包都来自项目本身。

Manifest-Version: 1.0
Bundle-SymbolicName: tx-core
Archiver-Version: Plexus Archiver
Built-By: User
Bnd-LastModified: 1466089543997
Bundle-ManifestVersion: 2
Import-Package: cafe.crypto,tx.core,tx.core.conf,tx.core.conv,tx.core.
production,tx.core.query,tx.core.util,javax.crypto,javax.crypto.spec,
javax.servlet
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
DynamicImport-Package: javax.*, org.xml.sax, org.xml.sax.*,org.w3c.*
Tool: Bnd-3.0.0.201509101326
Export-Package: cafe.crypto;version="4.0.1",tx.core;uses:="tx.core.pro
duction,tx.core.query";version="4.0.1",tx.core.conf;uses:="tx.core,tx
.core.production";version="4.0.1",tx.core.conv;version="4.0.1",tx.cor
e.identity;version="4.0.1",tx.core.io;uses:="tx.core,tx.core.producti
on";version="4.0.1",tx.core.notify;version="4.0.1",tx.core.production
;uses:="tx.core,tx.core.conv,tx.core.query";version="4.0.1",tx.core.q
uery;uses:="tx.core.conv";version="4.0.1",tx.core.util;version="4.0.1
",tx;version="4.0.1"
Bundle-Name: tx-core
Bundle-Version: 4.0.1
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.8.0_77

感谢您的任何和所有帮助。

对于给定捆绑包内部的包,无需导入它们。<Import-Packages>用于指示捆绑包所需的包。

如果没有看到您的POM/MANIFEST或知道您用于OSGi捆绑的Maven插件,我不完全确定为什么星号会显示所有内部软件包。我怀疑您的 POM/清单正在使用<Export-Package>导出所有内部包。

来自Apache Felix Maven捆绑插件文档的更新

假定<Import-Package>为"*",它导入捆绑包内容引用但不包含在捆绑包中的所有内容。默认情况下,还会导入任何导出的包,以确保一致的类空间。

请参阅捆绑包是否应该导入其自己的导出包?,了解发生这种情况的原因。

默认情况下,如果未显式定义<Export-Package>,则会导出所有包(例外),然后重新导入:

现在假定<Export-Package>是本地 Java 源代码中的软件包集,不包括默认软件包 '." 和任何包含 'impl' 或 'internal' 的包。

对于捆绑包内部的包,如果您不打算让其他捆绑包能够引用它们,则有 2 种选择:

  1. 定义<Export-Package>中的其他捆绑包公开的包的显式列表
  2. 定义一个不希望向<Private-Package>中的其他捆绑包公开的包的显式列表

你根本不需要写一个<Import-Package>头。默认值为"*",表示"导入捆绑包中的代码引用但实际上未出现在捆绑包中的所有包"。

如果这是生成"内部"包作为导入,那么它们不是内部包,即由于某种原因它们不包含在捆绑包中。需要查看更多项目结构才能诊断此问题。

最新更新