在 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 个选择:
- 定义您希望公开给
<Export-Package>
中的其他包的明确包列表
- 定义您不希望暴露给
<Private-Package>
中其他包的明确包列表
您根本不需要写 <Import-Package>
header。默认值为“*”,表示 "import all packages that are referenced by the code in the bundle but don't actually appear in the bundle".
如果这是生成 "internal" 包作为导入,那么它们 不是 内部包,即由于某种原因它们没有被包含在包中。需要查看更多项目结构才能诊断此问题。
我最近开始将现有的 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 个选择:
- 定义您希望公开给
<Export-Package>
中的其他包的明确包列表
- 定义您不希望暴露给
<Private-Package>
中其他包的明确包列表
您根本不需要写 <Import-Package>
header。默认值为“*”,表示 "import all packages that are referenced by the code in the bundle but don't actually appear in the bundle".
如果这是生成 "internal" 包作为导入,那么它们 不是 内部包,即由于某种原因它们没有被包含在包中。需要查看更多项目结构才能诊断此问题。