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

tba*_*ker 10 eclipse osgi eclipse-rcp tycho maven

背景

我的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 IDE中开发组件而无需core在Eclipse中作为项目打开.

推测

这是我方的一些猜测.如果我错了请纠正我,也欢迎任何其他解决实际问题的方法!

  • 我知道Eclipse IDE 的m2e插件目前将Maven POM映射到Eclipse概念(使用m2e连接器).我安装了专用的Tycho连接器.例如,mvn编译步骤实际上是由Eclipse JDT编译器执行的.

  • 我也知道,当在Eclipse中启动完整的Tycho产品时,它将在Eclipse PDE环境中运行.例如,我需要在Run配置中指定目标平台.

  • 我知道我可以打开Eclipse工作区中的所有组件.这样可以解决问题,但由于我有很多组件,因此不可行,这会破坏独立的组件开发.

  • 我假设Eclipse m2e映射和/或PDE构建环境不够智能,无法在构建时自动获取(最新)依赖项.如果我错了,请纠正我.:)

  • 因此,我假设我还需要在构建时指定目标平台.我看了一下Window> Preferences> Plug-in Development> Target Platform.我可以将我们的p2存储库添加到目标平台,从而解决了这个问题.然而,这会带来许多问题:

    • 我需要一个包含所有组件的功能.只能添加功能.
    • 每次我部署单个组件的新版本时,我都必须重建完整的功能(在我们的p2存储库上创建一个新的功能版本).
    • 每次更新组件并构建功能时,我都必须手动更改目标平台.
  • 如果以上都是正确的,我推测我需要一个m2e连接器(或者与当前的连接器不同),在解析OSGi依赖关系时实际检查POM中指定的p2存储库并自动将它们添加到目标平台.

s.d*_*s.d 6

如Nick Wilson所示,您需要安装m2e Tycho配置器,它基本上"连接"Eclipse和Tycho(即,使Eclipse中的Tycho可用).

你应该在安装m2e之后指出它,但你也可以手动安装它:

  1. 转到窗口>首选项> Maven>发现.

  2. 单击"打开目录"按钮.这将打开"m2e Marketplace"窗口.

  3. 搜索"tycho",这应该给你"Tycho配置器"作为唯一的搜索结果.

  4. 点击"完成",你就完成了.

我也有这个问题,找到解决方案并不简单,所以我希望这有帮助!


obe*_*ies 5

在Eclipse中配置目标平台的"最自动化"方法是使用目标文件.该文件可以使用您的源签入,因此每个开发人员只需打开该文件并单击"设置为目标平台"即可激活它.AFAIK没有m2e连接器或Eclipse插件可以自动完成.

鉴于您的开发过程,设置此目标文件有点棘手.由于您没有包含所有捆绑包的最新版本的功能,因此需要将捆绑包直接包含在目标文件中.这不是通过丰富的编辑器实现的,但可以使用文本编辑器完成:

  1. 创建目标定义文件,添加p2存储库,然后从该p2存储库中选择任何功能.保存文件.
  2. 在文本编辑器中打开目标文件,删除<unit>您添加的功能的条目.
  3. 而是为每个捆绑包添加一个条目:

    <unit id="a.bundle.symbolic.name" version="0.0.0"/>
    
    Run Code Online (Sandbox Code Playgroud)

然后,此目标文件包含每个列出的捆绑包的最新版本.要查看内容,请再次使用"目标编辑器"打开文件,然后切换到"内容"选项卡.现在,所有开发人员都可以使用此文件.

注意:当其中一个软件包的新版本部署到Nexus时,开发人员只有在打开目标文件并再次选择"设置为目标平台"时才会看到该新版本.