10

背景

我的 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命令

但是,在 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.

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

猜测

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

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

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

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

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

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

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

4

2 回答 2

6

正如 Nick Wilson 所指出的,您将需要安装m2e Tycho Configurator,它基本上“链接”了 Eclipse 和 Tycho(即,使 Tycho 在 Eclipse 中可用)。

安装 m2e 后,您应该已经指向它,但您也可以手动安装它:

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

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

  3. 搜索“tycho”,这应该会给您“Tycho Configurator”作为唯一的搜索结果。

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

我也遇到过这个问题,找到解决方案并不容易,所以我希望这会有所帮助!

于 2013-09-12T14:36:59.627 回答
5

在 Eclipse 中配置目标平台的“最自动化”方式是使用目标文件。该文件可以与您的资源一起签入,因此每个开发人员只需打开该文件并单击“设置为目标平台”即可激活它。AFAIK 没有自动执行此操作的 m2e 连接器或 Eclipse 插件。

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

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

    <unit id="a.bundle.symbolic.name" version="0.0.0"/>
    

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

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

于 2013-09-20T09:00:58.997 回答