如何避免eclipse目标定义中的特定功能版本

时间:2015-11-11 07:59:25

标签: java eclipse osgi eclipse-rcp tycho

我有一个osgi项目,分为3个存储库。每个存储库都有自己的构建到使用Tycho的p2存储库:

Repo1 -> P2 repo 1
Repo2 -> P2 repo 2
Repo3 -> P2 repo 3

此外,每个存储库都有一个目标定义文件,其中包含来自第三方p2存储库和另一个项目存储库的包(上面的P2 repo1,P2 repo 2或P2 repo 3)。 Repo2包含对Repo1包的依赖,Repo3依赖于Repo1和Repo2包:

Repo1 Target Definition -> Eclipse Orbit P2
Repo2 Target Definition -> Eclipse Orbit P2, P2 repo1
Repo3 Target Definition -> Eclipse Orbit P2, P2 repo1, P2 repo2

现在我有以下问题。构建第一个存储库后,P2 repo1存储库已更新,并包含具有新快照版本的功能。 Repo2和Repo3的目标定义取决于Repo1包的先前快照版本,如果不更新相应的目标定义,则无法构建这些存储库(在Eclipse中,目标编辑器中有更新按钮)。

<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<unit id="com.myproduct.feature.api.game.feature.group" version="1.0.0.201509251400"/>
<unit id="com.myproduct.feature.impl.game.feature.group" version="1.0.0.201509251400"/>
<repository location="http:............../target/repository/"/>
</location>

因此无法自动构建所有3个repos,因此构建过程变得过于复杂:

  • 提交第一个回购中的更改并使用Jenkins构建
  • 更新repo2的目标定义,将其指向新版本的repo 1功能
  • 在repo2中提交此更新并使用Jenkins构建

等...

我现在正在考虑使用git子模块来集成这3个repos以避免使用p2存储库或将所有存储库移到一个存储库中。

1 个答案:

答案 0 :(得分:10)

将版本设置为0.0.0

我不知道如何使用目标编辑器编辑 .target 文件来实现此目的,但您可以输入版本号0.0.0在目标文件中通过XML或文本编辑器编辑,如下所示:

<location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
  <unit id="com.example.feature.group" version="0.0.0"/>
  <repository id="my_repo" location="http://my/repo/path"/>
</location>

通过在目标文件中指定版本号0.0.0,您应该从p2存储库中获取最新版本的设备。

也就是说,使用这个 lazy (更多关于下面的名称)指定版本的方法存在严重的缺点。这使得返回并重建项目的旧版本非常困难,因为旧版本将从p2存储库而不是正确的版本中提取最新版本的依赖项。

使用目标平台定义DSL和生成器

而不是使用目标编辑器进行编辑,而是使用优秀的"Target Platform Definition DSL and Generator"。它允许您更明智地编辑目标文件。在上述情况下,您可以使用lazy版本关键字指定您希望0.0.0作为版本号。它看起来像这样:

location "http://my/repo/path" my_repo {
    com.example.feature.group lazy
}

两全其美

可以在command line(例如,从pom.xml)调用生成器,这应该允许您在 .tpd 文件中保留版本号。如果 .tpd 文件中没有版本号,则生成的 .target 文件将具有已解析的版本号到最新版本。如果将生成的 .target 文件保留为构建工件的一部分,则可以根据正确的依赖关系重建旧版本的软件。