标签: tycho

Tycho和Eclipse:如何在Eclipse中的开发时将OSGI依赖关系解析为我自己的bundle,而无需在IDE中打开所有这些依赖关系

背景

我的Eclipse RCP应用程序是使用Tycho构建的.它由多个组件组成(以OSGi包/ Eclipse插件的形式).其中一个组件包含产品文件并实现产品.

应用程序根目录下有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy).

构建这样的单个组件的工作原理如下:

  1. 从我们公司(p2)存储库中检索所有组件依赖项的最新版本.
  2. 构建组件.
  3. 将组件部署到我们的公司存储库,以用作其他组件本身的依赖项.

注意:我们的存储库是托管在Nexus上的普通maven2存储库,其RCP工件也自动映射到p2存储库格式.这样,Tycho可以使用p2存储库格式来查找依赖项,而可以使用标准的Maven部署.这很好用.

注意:我的父POM确保我们在p2存储库URL中查找依赖项.部署URL是存储库的默认maven2格式位置.这很好用.

问题

当通过命令行(mvn deploy)构建这样的单个组件时,Maven 在p2存储库中查找项目内依赖项并正确解析它们(即最新版本会自动下载并在构建中使用).

但是,在Eclipse中进行开发时,IDE无法解析它们.清单文件在我的每个项目内依赖项中都会出现错误,导致无法解析这些错误.

我的问题是:如何让Eclipse IDE在以下任何一个中查找依赖项(以及新版本的依赖项):

  • 我的本地p2存储库(~/.m2/repository/p2/osgi/bundles)
  • 我的公司p2仓库(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 …

eclipse osgi eclipse-rcp tycho maven

10
推荐指数
2
解决办法
6673
查看次数

使用Maven构建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安装.

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-第一件文物

我还尝试了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-plugin p2 eclipse-rcp tycho maven

10
推荐指数
1
解决办法
4034
查看次数

Tycho:单独构建插件时无法解决对项目其他插件的依赖性

我有一个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)

eclipse osgi artifactory tycho maven

9
推荐指数
1
解决办法
6862
查看次数

如何让单元测试在Maven Tycho构建中运行?

在过去使用JUnit和Mockito(以及PowerMock)编写运行在"常规" 版本中的单元测试时,我做了很多工作Maven.我现在正在开发一个Eclipse插件代码库,它使用Maven Tycho构建.

总的来说,它是一个多项目构建,但我只是将单元测试添加到其中一个插件项目(目前).

我听说过tycho-surefire,但这看起来很复杂,听起来更像是支持集成测试而不是单元测试.我猜我可能别无选择,只能使用它,但到目前为止我还没有尝试整合它.

我尝试从Maven获取JUnit和Mockito工件,然后使用它maven-dependency-plugin来获取可用于Bundle-Classpath清单属性中的工件.

当我运行的构建中,tycho-compiler-plugin我看到它编译105个源文件,其中包括所有的类src/main/javasrc/test/java.它无法访问compile测试类,因为它无法找到Mockito类,即使我在运行构建时-X,它也会mockito-all依赖关系树中显示工件.

我能在这做什么?

java eclipse junit tycho maven

9
推荐指数
2
解决办法
1914
查看次数

使用maven tycho构建一个由maven-dependency-plugin下载的清单条目Bundle-ClassPath

我有一个带有此清单的eclipse插件:

...
Bundle-ClassPath: .,
 lib/drools-api.jar,
 lib/drools-core.jar,
...
Run Code Online (Sandbox Code Playgroud)

现在我们不想放入drools-api.jardrools-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)

java osgi build tycho maven

8
推荐指数
1
解决办法
3216
查看次数

如何让Jenkins,Sonar和JaCoCo插件为Eclipse Tycho插件项目(或者Cobertura)一起工作?

我的设置是:

  • 詹金斯1.448
  • 声纳2.13
  • 詹金斯声纳插件1.72
  • Sonar的MySql数据库

我有以下项目:

  • Eclipse插件项目
  • 使用Maven
  • 多个模块(父maven项目,源插件项目,测试片段项目)
  • 一个简单的JUnit测试,测试一个源插件项目的类

目前的流程是什么:

  • Jenkins从SVN中检出父项目
  • Jenkins使用Maven和Tycho构建项目及其模块
  • Jenkins使用Surefire执行测试并生成报告
  • Jenkins使用Jenkins Sonar插件启动mvn sonar:sonar来执行代码分析
  • 对每个模块进行静态代码分析
  • JaCoCo失败了

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)

cobertura tycho jenkins jacoco sonarqube

8
推荐指数
1
解决办法
9069
查看次数

如何调试Tycho运行的测试用例?

使用Tycho构建项目时,测试用例使用equinox启动程序在新进程中运行-application org.eclipse.tycho.surefire.osgibooter.headlesstest.

如何调试测试用例?

java remote-debugging tycho tycho-surefire-plugin

8
推荐指数
2
解决办法
1850
查看次数

Tycho:当通过多模块父母建立时,"无法满足依赖性......"

我必须构建一个带有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)

tycho maven

8
推荐指数
1
解决办法
6257
查看次数

如何使用Maven部署本地已安装的工件

故事

我知道,maven deploy命令贯穿整个生命周期.我的问题是,我需要花费很多时间.让我解释:

  • 有一个从服务器构建的应用程序,以及一个单一来源的Eclipse RAP和RCP客户端
  • 通信由与服务器一起构建的共享API项目定义,但GUI项目也需要这些项目
  • GUI项目由第谷建,所以其不可能在一个内部版本两者(在一个反应器中,编辑:由于P2的工件是用于RCP和RAP不同)
  • 我使用多步Jenkins构建版本.为了确保一切正常,我首先对服务器和GUI变体进行逐个安装,然后我部署它们,如果没有任何失败

两次建造都需要花费很多时间.是否有类似" 请简单地将所有构建的工件从我的本地存储库部署到POM定义的存储库并跳过整个生命周期 "?

maven-3 tycho maven maven-deploy-plugin

8
推荐指数
1
解决办法
3951
查看次数

How can I make Tycho load platform specific fragment into the test runtime for any OS?

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 …

java eclipse multiplatform tycho maven

8
推荐指数
1
解决办法
2165
查看次数