我有几个在 Eclipse 中构建的 OSGi 包,它们使用普通的清单管理依赖项和使用 Maven Tycho 的外部构建。
在 Equinox 上运行 Eclipse 内的包可以正常工作。用 Tycho 构建它们效果很好。
现在我想使用 Tycho Surefire 来运行集成测试,为此我创建了一个包含一些基本测试的简单测试包。正在测试的包依赖于 OSGi 容器中存在的一些其他包和一些小的启动级别调整,以便正确运行 - 就像我说的,当在 Equinox 上正常运行它们时,包本身启动得非常好。
因此,为了模仿 Tycho Surefire,我在测试包的 pom.xml 中指定了以下内容:
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-surefire-plugin</artifactId>
<version>0.21.0</version>
<configuration>
<bundleStartLevel>
<bundle>
<id>org.hibernate.osgi</id>
<level>6</level>
<autoStart>true</autoStart>
</bundle>
<!-- plus a few more bundles in the real pom.xml -->
</bundleStartLevel>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<configuration>
<dependency-resolution>
<extraRequirements>
<requirement>
<type>eclipse-plugin</type>
<id>org.hibernate.entitymanager</id>
<versionRange>4.2.12.Final</versionRange>
</requirement>
<requirement>
<type>eclipse-plugin</type>
<id>org.hibernate.osgi</id>
<versionRange>4.2.12.Final</versionRange>
</requirement>
<!-- plus a few more bundles in the real pom.xml -->
</extraRequirements>
</dependency-resolution>
</configuration>
</plugin>
</plugins>
</build>
有趣的是,测试失败了。经过一些研究,我发现了如何在失败的测试运行期间/之后访问 OSGi 控制台以进一步调查问题(运行 tycho 测试后的 OSGi 控制台)。
我的发现是,尽管 OSGi 容器中存在所有必要的捆绑包(所有可传递派生的捆绑包和所有手动指定的捆绑包),但只有具有独特<bundleStartLevel>
性的捆绑包已启动(当然还有 OSGi 核心捆绑包)。
因此,鉴于上述示例,我的发现是,虽然两者org.hibernate.osgi
都已org.hibernate.entitymanager
解决,但只有第一个处于“活动”状态。这显然会扰乱整个启动过程,我的猜测是,如果捆绑包按预期启动,测试会运行良好。
当我查看“正常”的 Eclipse-OSGi-Launch 配置时,有一个参数“默认自动启动”默认设置为 true。我在 Tycho Surefire 文档中没有找到类似的内容,但是否有可能为某些捆绑包设置特定的启动级别以某种方式覆盖其他捆绑包的自动启动?至少我不会猜测 Tycho 默认情况下根本不会自动启动任何捆绑包......
我将不胜感激有关如何进一步调查该问题的任何提示,或有关如何让 Tycho 启动我的捆绑包而无需为每个捆绑包指定不同启动级别的任何线索。