在OSGI中导入内部包

时间:2016-06-16 15:39:41

标签: java import osgi pom.xml osgi-bundle

我最近开始将现有的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

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

<强>更新 来自Apache Felix Maven Bundle Plugin Docs

  

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

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

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

  现在假定

<Export-Package>是本地Java源代码中的包集合,不包括默认包“。”以及任何包含'impl'或'internal'的包。

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

  1. 定义想要<Export-Package>
  2. 中向其他捆绑包公开的软件包的明确列表
  3. 定义不希望<Private-Package>
  4. 中的其他捆绑包公开的软件包的明确列表

答案 1 :(得分:1)

您根本不需要编写doubleToLongBits(...)标题。默认值为&#34; *&#34;这意味着&#34;导入捆绑中代码所引用的所有包但实际上并未出现在捆绑包中#34;。

如果这是生成&#34;内部&#34;包作为导入然后它们是内部包,即由于某种原因它们没有包含在包中。需要看到更多的项目结构来诊断这个问题。