【发布时间】:2013-09-16 12:50:08
【问题描述】:
背景
我的 Eclipse RCP 应用程序是使用 Tycho 构建的。它由多个组件组成(以 OSGi 包/Eclipse 插件的形式)。其中一个组件包含产品文件并实现产品。
应用根目录下有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy)。
构建这样一个单一组件的工作原理如下:
- 从我们公司 (p2) 存储库中检索所有组件依赖项的最新版本。
- 构建组件。
- 将该组件部署到我们公司的存储库,以用作其他组件本身的依赖项。
注意:我们的存储库是托管在 Nexus 上的普通 maven2 存储库,其 RCP 工件也会自动映射到 p2 存储库格式。这样,Tycho 可以使用 p2 存储库格式来查找依赖项,同时可以使用标准的 Maven 部署。这很好用。
注意:我的父 POM 确保我们在 p2 存储库 URL 中查找依赖项。部署 URL 是存储库的默认 maven2 格式位置。这很好用。
问题
当通过命令行 (mvn deploy) 构建这样的单个组件时,Maven 会在 p2 存储库中查找 intra-project 依赖项并正确解析(即自动下载最新版本并用于构建)。
但是,在 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 格式提供这个部署的插件。
当我通过命令行(使用mvn install)构建fancy 组件时,会自动找到并下载(之前部署的)核心组件。
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 compile这一步实际上是由Eclipse JDT编译器执行的。
我还知道,当一个完整的 Tycho 产品在 Eclipse 中启动时,它是在 Eclipse PDE 环境中运行的。例如,我需要在我的运行配置中指定一个目标平台。
我知道我可以打开我的 Eclipse 工作区中的所有组件。这可以解决问题,但不可行,因为我有很多组件,这会破坏独立组件的开发。
我假设 Eclipse m2e 映射和/或 PDE 构建环境不够智能,无法在构建时自动获取(最新)依赖项。如果我错了,请纠正我。 :)
-
因此,我假设我也需要在构建时指定目标平台。我查看了 Window > Preferences > Plug-in Development > Target Platform。我可以将我们的 p2 存储库添加到目标平台,从而解决问题。然而这会带来很多问题:
- 我需要一个包含所有组件的功能才能工作。只能添加功能。
- 每次部署单个组件的新版本时,我都必须重新构建完整的功能(以在我们的 p2 存储库上创建新的功能版本)。
- 每次更新组件并构建功能时,我都必须手动更改目标平台。
1234563目标平台。
【问题讨论】:
-
您是否安装了 m2e 插件和 Tycho Configurator?
-
是的,m2e 已安装。我的包被配置为 Maven 项目和插件(即项目的构建器是 Java Builder、Plug-in Manifest Builder、Extension Point Schema Builder 和 Maven Project Builder)。 Maven 生命周期映射是为 Tycho 自动配置的。我不知道你所说的“Tycho Configurator”是什么意思?
-
听起来与我正在尝试做的事情非常相似,但我遇到了各种各样的麻烦。你能分享你的poms吗?您是否在 Nexus OSS 上完成了这项工作?
-
tbacker,你想清楚了吗。我现在和你在同一条船上,有一个公司 p2 设置并开发使用它的组件。命令行上的 Maven 运行良好,但安装的 m2e + tycho 配置器无法解决我的依赖关系。我注意到的一件事是,如果我右键单击一个插件并选择“属性...”并转到 Maven/生命周期映射,唯一的执行是“资源:资源”然后是“资源:测试资源”,所有第 cho 的都设置为“忽略”
标签: eclipse maven osgi eclipse-rcp tycho