【发布时间】:2012-04-04 08:02:01
【问题描述】:
我制作了一个小的 API Bundle 和一个应该使用 API 的服务包。
在我的 maven pom.xml 文件中,我在正确的版本中为我的 api 包添加了一个依赖项,如下所示:
<dependency>
<groupId>at.foobar.osgi.api</groupId>
<artifactId>foobarapi</artifactId>
<version>1.0</version>
</dependency>
我正在使用 maven-bundle 插件来创建包,因此我使用 mvn clean install 通过 jar 文件创建。
清单看起来像这样(服务):
Manifest-Version: 1.0
Private-Package: at.foobar.osgi.producer
Built-By: foobar
Tool: Bnd-0.0.238
Bundle-Name: foobarproducer
Created-By: Apache Maven Bundle Plugin
Bundle-Version: 1.0
Build-Jdk: 1.6.0_26
Bnd-LastModified: 1332185439257
Bundle-ManifestVersion: 2
Bundle-Activator: at.foobar.osgi.producer.Activator
Import-Package: at.foobar.osgi.api,org.osgi.framework;version="1.4"
Bundle-SymbolicName: at.foobar.osgi.producer.foobarproducer
这对我来说似乎没问题。导入就在那里,所以一切都应该没问题。
现在我启动了 Equinox 并安装了 API 和生产者捆绑包。 然后我启动了 API,效果很好。但是当我想启动生产者服务时,我得到了这个错误:
org.osgi.framework.BundleException: The bundle "at.foobar.osgi.producer.foobarproducer_1.0.0 [4]" could not be resolved. Reason: Missing Constraint: Import-Package: at.foobar.osgi.api; version="0.0.0"
框架好像找不到api,但是已经安装启动了?
【问题讨论】:
-
您是否启动了 equinox 控制台并运行“packages at.foobar.osgi.api”以确认您的 API 包已导出该包?如果你得到一个巨大的包滚动列表,这意味着没有包导出该包。我还会尝试使用“bundle [api-bundle-name]”来查看 API 包确实导出了哪些包 - 并确认它本身已启动。
-
mh 我忘了导出 API...但是我不明白为什么我需要导出它?我阅读了核心规范并认为不应导出 API 包,因为它已由 osgi 解析?
-
该包需要由您的包导出或包含在包中(即列出的私有包)。您都没有这样做,因此 Bnd 将其检测为导入的包。可能 Export 是正确的,因为它听起来像是其他包可能想要使用的 API。
-
关于您的问题“不应导出 API 包,因为它已由 osgi 解析”......这对我来说毫无意义。你能澄清一下你预计会发生什么吗?
-
@NeilBartlett:嗯,现在我明白了,这正是我在评论中提出的问题!