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

时间:2013-09-12 08:22:47

标签: eclipse maven osgi eclipse-rcp tycho

背景

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

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

构建这样的单个组件的工作方式如下:

  1. 从我们公司(p2)存储库中检索所有组件的依赖项的最新版本。
  2. 构建组件。
  3. 将组件部署到我们的公司存储库,以用作其他组件本身的依赖项。
  4. 注意:我们的存储库是托管在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>
    

    当我打开一个新的Eclipse工作区并打开fancy组件时,其Manifest(包含其依赖项)会出现以下错误:

    Bundle 'com.mycompany.myproduct.core' cannot be resolved.
    

    我的问题是:如何在Eclipse IDE中开发fancy组件,而无需在Eclipse中打开core项目。

    投机

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

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

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

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

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

    • 因此,我假设我还需要在构建时指定目标平台。我看了一下 Window&gt;偏好&gt;插件开发&gt;目标平台。我可以将我们的p2存储库添加到目标平台,从而解决了这个问题。然而,这会带来许多问题:

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

2 个答案:

答案 0 :(得分:6)

如Nick Wilson所示,您需要安装 m2e Tycho配置器,它基本上“连接”Eclipse和Tycho(即,在Eclipse中提供Tycho)。

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

  1. 转到窗口&gt;偏好&gt; Maven&gt;发现。

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

  3. 搜索“tycho”,这应该会为您提供“Tycho配置器”作为唯一的搜索结果。

  4. 点击“完成”,你就完成了。

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

答案 1 :(得分:5)

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

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

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

    <unit id="a.bundle.symbolic.name" version="0.0.0"/>
    
  4. 然后,此目标文件包含每个列出的捆绑包的最新版本。要查看内容,请使用&#34;目标编辑器&#34;打开文件。再次切换到&#34;内容&#34;标签。现在,所有开发人员都可以使用此文件。

    注意:当其中一个软件包的新版本部署到Nexus时,开发人员只有在打开目标文件并选择&#34;设置为目标平台&#34;试。