在 OSGI 中导入内部包

Importing Internal Packages in OSGI

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

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

我是否需要在 <Import-Packages> 的项目中列出使用过的包,如果是,为什么我觉得没有必要。

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

这是 tx-core 的结果 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/MANIFEST 正在使用 <Export-Package> 导出所有内部包。

更新 来自 Apache Felix Maven Bundle Plugin Docs:

<Import-Package> is assumed to be "*", which imports everything referred to by the bundle content, but not contained in the bundle. Any exported packages are also imported by default, to ensure a consistent class space.

请参阅 Should a bundle import its own exported packages? 了解发生这种情况的原因。

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

<Export-Package> is now assumed to be the set of packages in your local Java sources, excluding the default package '.' and any packages containing 'impl' or 'internal'.

对于您的包内部的包,如果您不希望其他包能够引用它们,您有 2 个选择:

  1. 定义您希望公开给<Export-Package>
  2. 中的其他包的明确包列表
  3. 定义您不希望暴露给<Private-Package>
  4. 中其他包的明确包列表

您根本不需要写 <Import-Package> header。默认值为“*”,表示 "import all packages that are referenced by the code in the bundle but don't actually appear in the bundle".

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