背景
我的 Eclipse RCP 应用程序是使用 Tycho 构建的。它由多个组件组成(以 OSGi 包/Eclipse 插件的形式)。这些组件之一包含产品文件并实现产品。
应用根目录有一个reactor POM,它按顺序构建所有组件,但我也想独立构建其他组件(使用mvn deploy
)。
构建这样一个组件的工作原理如下:
- 从我们公司 (p2) 存储库中检索所有组件依赖项的最新版本。
- 构建组件。
- 将该组件部署到我们公司的存储库,以用作其他组件本身的依赖项。
注意:我们的存储库是托管在 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 存储库并自动将它们添加到目标平台。