我最近开始将现有的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
感谢您提供任何帮助。
答案 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'的包。
对于捆绑包内部的包,如果您不打算让其他捆绑包引用它们,您有两种选择:
<Export-Package>
<Private-Package>
答案 1 :(得分:1)
您根本不需要编写doubleToLongBits(...)
标题。默认值为&#34; *&#34;这意味着&#34;导入捆绑中代码所引用的所有包但实际上并未出现在捆绑包中#34;。
如果这是生成&#34;内部&#34;包作为导入然后它们是不内部包,即由于某种原因它们没有包含在包中。需要看到更多的项目结构来诊断这个问题。