sin*_*ina 5 java eclipse-plugin tycho maven tycho-surefire-plugin
我有几个OSGi捆绑包,这些捆绑包是在Eclipse中使用正常的清单管理的依赖关系以及使用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>
Run Code Online (Sandbox Code Playgroud)
有趣的是,测试失败了。经过一些研究,我发现在失败的测试运行期间/之后如何访问OSGi控制台以进一步调查问题(运行tycho测试后的OSGi控制台)。
我的发现是,尽管OSGi容器中存在所有必需的捆绑软件(所有可传递衍生的捆绑软件和所有手动指定的捆绑软件),但只有具有独特特征<bundleStartLevel>的捆绑软件才被启动(当然还有OSGi-core-bundles)。
因此,考虑上面的例子中,我发现是,虽然双方org.hibernate.osgi并org.hibernate.entitymanager已得到解决,只有第一个是在“有效”状态。这显然使整个启动混乱,并且我的猜测是,如果捆绑包按预期启动,则测试可以正常运行。
当我查看“常规” Eclipse-OSGi-Launch配置时,有一个参数“ Default Auto-Start”默认情况下设置为true。我在Tycho Surefire文档中没有找到类似的东西,但是是否可以为某些捆绑软件设置特定的启动级别而以某种方式覆盖其他捆绑软件的自动启动?至少我不会猜到Tycho在默认情况下根本不会自动启动任何捆绑软件...
我希望获得关于如何进一步调查该问题的任何提示,或者与如何使Tycho启动我的捆绑包而不必为每个捆绑包指定不同的启动级别有关的任何线索。
如果有人仍然遇到这个问题:
从 Tycho 0.23 开始,捆绑包自动启动是可配置的。
<configuration>
<defaultStartLevel>
<level>7</level>
<autoStart>true</autoStart>
</defaultStartLevel>
</configuration>
Run Code Online (Sandbox Code Playgroud)