我的Eclipse RCP应用程序是使用Tycho构建的.它由多个组件组成(以OSGi包/ Eclipse插件的形式).其中一个组件包含产品文件并实现产品.
应用程序根目录下有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy).
构建这样的单个组件的工作原理如下:
注意:我们的存储库是托管在Nexus上的普通maven2存储库,其RCP工件也自动映射到p2存储库格式.这样,Tycho可以使用p2存储库格式来查找依赖项,而可以使用标准的Maven部署.这很好用.
注意:我的父POM确保我们在p2存储库URL中查找依赖项.部署URL是存储库的默认maven2格式位置.这很好用.
当通过命令行(mvn deploy)构建这样的单个组件时,Maven 在p2存储库中查找项目内依赖项并正确解析它们(即最新版本会自动下载并在构建中使用).
但是,在Eclipse中进行开发时,IDE无法解析它们.清单文件在我的每个项目内依赖项中都会出现错误,导致无法解析这些错误.
我的问题是:如何让Eclipse IDE在以下任何一个中查找依赖项(以及新版本的依赖项):
~/.m2/repository/p2/osgi/bundles)nexus.mycompany.com/myproduct-snapshots/.meta/p2)理想情况下,如果有更新版本,它每次都会查找它们并获取最新版本.
如果它不使用POM中的p2存储库URL,我应该如何配置Eclipse?
考虑一个eclipse插件com.mycompany.myproduct.fancy,它依赖于另一个eclipse插件com.mycompany.myproduct.core.
两者都有一个POM(配置为Tycho使用),它(通过其父POM)正确配置了我的Nexus存储库:部署的maven2存储库URL和查找依赖关系的p2存储库URL.
首先,我将core插件部署到我的maven存储库(使用默认值mvn deploy).Nexus存储库将以maven和p2格式提供此部署的插件.
当我fancy通过命令行(使用mvn install)构建组件时,会自动找到并下载(先前部署的)核心组件.
project/com.mycompany.myproduct.fancy$ mvn clean install
<searches in p2 repository, download core>
<builds fancy>
<SUCCESS>
Run Code Online (Sandbox Code Playgroud)
当我打开一个新的Eclipse工作区并打开该fancy组件时,其Manifest(包含其依赖项)会出现以下错误:
Bundle 'com.mycompany.myproduct.core' cannot be resolved.
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何fancy在Eclipse …
我正在尝试配置Maven来构建Eclipse应用程序(与所有Eclipse EXE打包在一起的Eclipse插件等).
我已经完成了项目的几十个依赖项,并将它们部署到我们的内部Nexus(OSS)服务器.我还安装了Nexus P2 Repository插件和P2 Bridge插件(2.6.3-01)以及Nexus Unzip插件(0.12.0).我可以浏览到我们的组存储库的.meta/p2文件夹,但它当前是空的.
这应该比目前看起来简单得多.我的目标是Windows上的Eclipse 3.4.2(Ganymede).如果它有所不同,我们实际上将我们的应用程序部署为精简版/自定义Eclipse安装.
当我对着pom运行maven时,<packaging>eclipse-repository</packaging>我收到以下错误:
[ERROR] Missing requirement: MyApp 0.0.0 requires
'org.eclipse.equinox.executable.feature.group 0.0.0'
but it could not be found
Run Code Online (Sandbox Code Playgroud)
...我从哪里获得,以及如何将其添加到Nexus?
当我对着pom运行maven时,<packaging>eclipse-plugin</packaging>我收到以下错误:
[ERROR] Missing requirement: MyApp 0.0.0 requires
'bundle org.eclipse.ui 0.0.0'
but it could not be found
Run Code Online (Sandbox Code Playgroud)
...但是我在本地文件系统上找到了以下目录(怀疑itp-04-rcp生成了第一个目录):
D:\maven\repository\p2\osgi\bundle\org.eclipse.ui\3.6.2.M20110203-1100
D:\maven\repository\p2\osgi\bundle\org.eclipse.ui\3.7.0.v20110928-1505
Run Code Online (Sandbox Code Playgroud)
我还尝试了pom-first-dependencies和manifest-first-dependency组合:http://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts
我不明白这是如何工作的 - 我可以从Git构建itp02.我可以看到它构建了两个包:
+---------------------+---------------------+--------------------------------------+ | artifactId | Bundle-Name | Bundle-SymbolicName | +---------------------+---------------------+--------------------------------------+ | pomfirst-bundle | pomfirst-bundle | tycho.demo.itp02.pomfirst-bundle | | pomfirst-thirdparty | pomfirst-thirdparty | tycho.demo.itp02.pomfirst-thirdparty | …
我有一个Eclipse RCP应用程序,它使用Tycho插件与Maven构建.有一个主POM包含所有插件和功能作为模块.
如果我使用Maven 安装主POM,则生成的反应器构建工作正常.所有模块都已构建,安装成功.
但是,如果我单独构建一个Eclipse 插件,则无法解析其与应用程序其他插件的依赖关系.
对第三方库(例如Eclipse平台)的依赖似乎工作正常.我们的应用程序的Eclipse插件只有这种类型的依赖项才能成功构建.
控制台输出如下:
[INFO] Resolving dependencies of MavenProject: com.mycompany.myproduct:com.mycompany.myproduct.gui.editors:1.8.15-SNAPSHOT @ /<path>/com.mycompany.myproduct.gui.editors/pom.xml
[INFO] Cannot complete the request. Generating details.
[INFO] Cannot complete the request. Generating details.
[INFO] {osgi.ws=gtk, osgi.os=linux, osgi.arch=x86, org.eclipse.update.install.features=true}
[ERROR] Cannot resolve project dependencies:
[ERROR] Software being installed: com.mycompany.myproduct.gui.editors 1.8.15.qualifier
[ERROR] Missing requirement: com.mycompany.myproduct.gui.editors 1.8.15.qualifier requires 'bundle com.mycompany.myproduct.preferences 1.8.15' but it could not be found
[ERROR]
[ERROR] Internal error: …Run Code Online (Sandbox Code Playgroud) 在过去使用JUnit和Mockito(以及PowerMock)编写运行在"常规" 版本中的单元测试时,我做了很多工作Maven.我现在正在开发一个Eclipse插件代码库,它使用Maven Tycho构建.
总的来说,它是一个多项目构建,但我只是将单元测试添加到其中一个插件项目(目前).
我听说过tycho-surefire,但这看起来很复杂,听起来更像是支持集成测试而不是单元测试.我猜我可能别无选择,只能使用它,但到目前为止我还没有尝试整合它.
我尝试从Maven获取JUnit和Mockito工件,然后使用它maven-dependency-plugin来获取可用于Bundle-Classpath清单属性中的工件.
当我运行的构建中,tycho-compiler-plugin我看到它编译105个源文件,其中包括所有的类src/main/java和src/test/java.它无法访问compile测试类,因为它无法找到Mockito类,即使我在运行构建时-X,它也会mockito-all在依赖关系树中显示工件.
我能在这做什么?
我有一个带有此清单的eclipse插件:
...
Bundle-ClassPath: .,
lib/drools-api.jar,
lib/drools-core.jar,
...
Run Code Online (Sandbox Code Playgroud)
现在我们不想放入drools-api.jar和drools-core.jar控制源代码,因此我们使用插件从maven存储库中获取它们:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-bundle-classpath-libs</id>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>lib</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>org.drools</groupId>
<artifactId>drools-api</artifactId>
</artifactItem>
<artifactItem>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</artifactItem>
...
Run Code Online (Sandbox Code Playgroud)
但是,我们第一次构建此模块时,它会失败,因为这会发生:
[WARNING] Missing classpath entry lib/drools-api.jar ...
[WARNING] Missing classpath entry lib/drools-core.jar ...
...
[INFO] --- maven-dependency-plugin:2.1:copy (copy-bundle-classpath-libs) ... ---
...
[INFO] Copying drools-api-5.2.0-SNAPSHOT.jar to .../lib/drools-api.jar
[INFO] Copying drools-core-5.2.0-SNAPSHOT.jar to .../lib/drools-core.jar
...
[INFO] --- maven-osgi-compiler-plugin:0.10.0:compile (default-compile) ... ---
...
[INFO] …Run Code Online (Sandbox Code Playgroud) 我的设置是:
我有以下项目:
目前的流程是什么:
Sonar具有可用的静态代码分析统计信息,并显示测试成功百分比.唯一缺少的是JaCoCo的代码覆盖......甚至可能是Cobertura的代码覆盖率.
我现在并不在乎,我只想要其中一个产生代码覆盖率的结果.
Cobertura似乎无法产生结果,可能是因为它无法检测代码 - 它在错误的位置查找已检测的代码 - 它无法应对Tycho或单独的源/测试代码设置
JaCoCo应该能够"动态"观察代码覆盖率,但其输出是
[INFO] [17:44:04.708] Sensor JaCoCoSensor...
[INFO] [17:44:04.717] Project coverage is set to 0% as no JaCoCo execution data has been dumped: /var/lib/jenkins/jobs/testPlugin/workspace/testSource/target/jacoco.exec
[INFO] [17:44:04.854] Sensor JaCoCoSensor done: 146 ms
[INFO] [17:44:10.587] Sensor JaCoCoSensor...
[INFO] [17:44:10.587] Project coverage is set to 0% as no JaCoCo execution data has been dumped: /var/lib/jenkins/jobs/testPlugin/workspace/testTest/target/jacoco.exec
[INFO] [17:44:10.631] Sensor JaCoCoSensor …Run Code Online (Sandbox Code Playgroud) 使用Tycho构建项目时,测试用例使用equinox启动程序在新进程中运行-application org.eclipse.tycho.surefire.osgibooter.headlesstest.
如何调试测试用例?
我必须构建一个带有Maven/Tycho的Eclipse插件,它与其他第三方有依赖关系.由于Tycho尚不支持嵌入依赖项,因此我将项目拆分为以下两项:
A-thirdparty:带有打包'bundle'的项目,由maven-bundle-plugin构建,具有'Embed-Dependency'指令,并导出插件'A'所需的所有包A:项目包装'eclipse-plugin',使用tycho-maven-plugin,以及Tycho的target-platform-configuration插件,pomDependencies设置为consider.当我单独构建它们时(首先是第三方聚合器,然后是项目A本身),一切正常.但是,如果我聚合这两个项目(使用多模块POM),我得到以下Maven错误:
Caused by: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from A 1.0.0.qualifier to package org.apache.axis2.transaction 0.0.0.", "Unable to satisfy dependency from A 1.0.0.qualifier to package org.apache.axis2.addressing.i18n 0.0.0.", ...
Run Code Online (Sandbox Code Playgroud)
为什么以聚合方式构建项目会导致此错误,如果这是Tycho错误,可以采用哪种解决方法?
但是,如果我只在聚合POM中保留一个模块(独立于哪一个),则没有错误.
编辑
无法使用小型,类似的多模块样本进行重现.这意味着我的POM层次结构有所不同.
EDIT2
在包含相同的依赖集(一对轴2和公理库)之后,能够使用类似的小模块样本进行再现.
EDIT3:简约示例
现在我想知道问题是否缺少我所包含的第三方库所需的所有第三方.如果是这样,那么为什么我能够在单独执行两个模块时成功构建,并且只有通过父模块,多模块pom.xml完成构建才会失败?下面的示例仅包含一个单轴2内核JAR,它捆绑在名为first-thirdparty的pom-first工件中.
而不是A,例子有keywoard first.文件夹结构如下:
./pom.xml
./first-thirdparty
pom.xml
./first
src/main/java/org/mydemo/Test.java // has …Run Code Online (Sandbox Code Playgroud) 我知道,maven deploy命令贯穿整个生命周期.我的问题是,我需要花费很多时间.让我解释:
两次建造都需要花费很多时间.是否有类似" 请简单地将所有构建的工件从我的本地存储库部署到POM定义的存储库并跳过整个生命周期 "?
I'm using Tycho to build and test some eclipse plugins. I have one bundle that has many platform specific fragments. I also have one test bundle that is using tycho-surefire-plugin to test the original bundle that has the platform specific fragments. However, Tycho is not including the current platform's fragment into the test runtime.
All of the platform specific fragments look like the win64 fragment manifest listed below. (There are actually six fragments in total, one for each platform combination …