使用Tycho构建项目时,测试用例使用equinox启动程序在新进程中运行-application org.eclipse.tycho.surefire.osgibooter.headlesstest.
如何调试测试用例?
我目前正试图通过tycho完成我的构建(~30个捆绑).在我的单元测试中
使用Mockito时遇到了一些令人困惑的问题.
我eclipse-test-plugin为测试包创建了一个as片段项目.由于tycho应该使用清单解析所需的包,我从中删除了对mockito的依赖pom.xml.
然后,当我尝试将mockito添加到清单中所需的包中时,未列出mockito.我找到了这篇文章并创建了一个指向eclipse indigo的目标平台.
我包含了平台细节,所以我不需要eclipse delta包.然后发生了第一件奇怪的事情.Eclipse告诉我有一些不可靠的依赖关系,当我在eclipse中将新创建的目标平台设置为活动时,eclipse不再org.osgi.framework能解决诸如此类的软件包等问题.但是,当我构建一个eclipse-product使用tycho和目标平台时,它正在工作.

如果我将当前的eclipse安装设置为活动平台,则会解析捆绑包.我选择了以下的indigo版本:
所以我的第一个问题是"我的目标平台出了什么问题,以便tycho能够使用它而不是eclipse?"
为了更接近我原来的问题(让mockito运行)我将当前的eclipse安装设置为活动目标平台.然后Eclipse可以解析org.osgi.framework包和其他包.
我pom.xml在上面提到的帖子中再次添加了之前删除的依赖于mockito .但是当我尝试将它添加到清单中所需的包时,我仍然找不到mockito.
所以我的第二个问题是"我做错了什么?你如何引用未在eclipse更新站点发布的包,例如maven中央存储库?"
更新:在我的研究过程中,我发现了两种方法,即在我的目标平台中包含来自非p2-update-sites的 bundle :
eclipse-repository 其中包括所有需要的包.然后将创建的工件部署到公共Web服务器.在您的目标平台中,您可以参考Nexus p2-proxy仓库或Web托管的p2-repo.
有谁知道其他方式 - 可能更方便/更便宜?
请帮助我理解混乱的tycho世界......
提前谢谢
这是Tycho社区经常提出的一个问题:
我将Eclipse RCP构建从[ 以前的技术,例如
eclipse-application/ PDE无头构建/ ...]迁移到使用包装类型使用Tycho构建产品的新推荐方法eclipse-repository.现在我的发行版包含比以前更多的包.问题似乎是Tycho引入了我的产品中包含的bundle的可选依赖项.我怎么能阻止这个?
当使用tycho-surefire-plugin执行JUnit测试时,tycho会分配一个equinox运行时.在极少数情况下,可能会发生OSGi测试运行时中的某些bundle无法解析/启动(例如,包使用冲突).如果您阅读调试日志(maven CLI选项-X),您会发现类似的内容
!ENTRY org.eclipse.osgi 2 0 2012-10-08 16:41:31.635
!MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists:
!SUBENTRY 1 org.eclipse.osgi 2 0 2012-10-08 16:41:31.635
An error has occurred. See the log file
C:\mytestproject.tests\target\work\configuration\1349705136008.log.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12:03.181s
[INFO] Finished at: Mon Oct 08 16:17:16 CEST 2012
[INFO] Final Memory: 20M/309M
[INFO] …Run Code Online (Sandbox Code Playgroud) 这是我的配置:
我们正在开发一个OSGi应用程序,并希望包含日志记录.我决定使用slf4j + logback.
我们使用Eclipse作为IDE和Tycho从Eclipse IDE(如Manifest Editor等)中受益.
所以我尝试了以下方法:
使用以下Manifest.mf创建了一个新插件:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Createcommand
Bundle-SymbolicName: de.hswt.oms.ws.wsr.createcommand
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: de.hswt.oms.ws.command.wsr,
de.hswt.oms.ws.ds.core.data.impl,
org.slf4j
Service-Component: OSGI-INF/component.xml
Run Code Online (Sandbox Code Playgroud)
现在,当我转到Run - > Run Configurations - > OSGi Framework并选择我的Bundle并单击"Add Required plugins"时,将选择100多个Bundles,我会收到很多错误和异常.
所以我想出了一个来自现有Jars的新插件,其中包括以下三个罐子:
如果我手动创建一个新的运行配置(不点击"添加必需的捆绑",它按预期工作,但只要我点击"添加必需的捆绑"我回到100多个捆绑包有很多错误(一些Jetty的东西为例...)
所以我的问题是:如何在我的OSGi应用程序中启用logback和slf4j并在eclipse中使用它并正确配置它?
如果您需要更多信息,请随时询问.
我们的目标是使用Tycho + Eclipse PDE在分布式团队中构建OSGi包.
到目前为止,工件已构建并部署到Nexus OSS存储库.这已经通过p2支持进行了扩充,"artifacts.xml"和"content.xml"由Tycho生成(或由Tycho提供),并由Tycho和p2浏览器正确解析.
缺少的链接是将生成的p2 bundle存储库添加到PDE使用的目标平台定义中.PDE目标编辑器显然只支持功能 或"分类"插件,没有普通的捆绑包.
Tycho的存储库插件和由不同合作伙伴独立开发的捆绑包的功能包装看起来太麻烦了.我们希望通过单个存储库遵循简单的Maven/OBR类共享包.
有没有办法根据本博客中建议的通用类别增强软件包或存储库的p2元数据,例如通过"tycho-p2-publisher:publish-categories"目标或通过配置/扩展"Nexus p2存储库"插件"让他们可以访问PDE UI?
这个问题似乎与这个问题有关,并提示尚未实现对"iu"语法的支持.
如何使用 tycho-surefire-plugin 在 Maven 中运行单个插件测试方法?
我尝试了-Dtest带有 # 的选项,但它不起作用:
mvn clean install -Dtest=MyUITest#testDummy
Run Code Online (Sandbox Code Playgroud)
我有什么遗漏的吗?
我没有对Maven做过很多,但我理解基础知识.我们正在使用Tycho来构建RCP插件,我想知道为什么Tycho使用integration-test阶段来执行捆绑测试.
是否有可能将某些类型的测试绑定到testMacho for Tycho而不是integration-test阶段?
如果是这样,怎么样?
我们有一个Eclipse插件,我们使用Maven和Tycho构建.但是,目前我们仍然通过一堆手动添加的JAR文件而不是Maven提供所有项目依赖项.这是由于以下原因:(1)依赖关系不能通过标准的Eclipse更新站点获得(至少在当前版本中不可用),(2)依赖关系不能作为bundle使用.
这些依赖项中最大的部分是Selenium库(API,远程,特定于浏览器的库及其传递依赖项,例如Guava等).
我浪费了几个小时,试图在我们的Maven构建过程中提取这些依赖项.在这个 SO问题之后,我尝试了p2-maven-plugin,创建了一个带有依赖关系的更新站点,我将其添加到Eclipse目标平台.但是,在运行时期间,无法加载在不同JAR中引用的类(我假设,从我非常有限的OSGi知识中,因为MANIFEST.MF文件中缺少一些必要的信息).这是一个问题的例子,在尝试创建一个RemoteWebDriver使用
DesiredCapabilities该类的时候(两个类都在不同的包中):
Exception in thread "Thread-8" java.lang.NoClassDefFoundError: org/openqa/selenium/remote/DesiredCapabilities
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:243)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:126)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:153)
…
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.remote.DesiredCapabilities cannot be found by org.seleniumhq.selenium.remote-driver_2.45.0
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
Run Code Online (Sandbox Code Playgroud)
使用时,还有什么我需要照顾的p2-maven-plugin吗?相关部分pom.xml看起来像这样:
<plugin>
<groupId>org.reficio</groupId>
<artifactId>p2-maven-plugin</artifactId>
<version>1.1.1-SNAPSHOT</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<artifacts>
<artifact>
<id>org.seleniumhq.selenium:selenium-remote-driver:2.45.0</id>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud) 我已经设法让JUnit 4.12 + Hamcrest 1.3 + Mockito 2.8.47在Eclipse中工作,这样当我将它们作为依赖项添加时,我的测试就会运行.
(我这样做的方法是使用p2-maven-plugin将Maven Central中的以下工件捆绑到插件/功能中并通过P2提供它们:
junit 4.12org.mockito.mockito-core 2.8.47org.hamcrest.all 1.3.0将插件作为依赖项添加到我的测试片段使得测试在Eclipse中运行.
但是,相同片段的Tycho构建将失败,并显示以下消息:
java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) previously initiated loading for a different type with name "org/hamcrest/Matcher"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:273)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:632)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:586)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:538)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:525)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:12)
at org.junit.Assert.assertThat(Assert.java:956)
at org.junit.Assert.assertThat(Assert.java:923)
Run Code Online (Sandbox Code Playgroud)
所以似乎其他一些插件正在我的片段 …