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

标签 java eclipse osgi eclipse-rcp tycho

我有一个分为 3 个存储库的 osgi 项目。每个存储库都有自己的内置到第谷的 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 bundle 的先前快照版本,如果不更新适当的目标定义(在 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,因此构建过程变得过于复杂:

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

等....

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

最佳答案

将版本设置为0.0.0

我不知道如何使用Target Editor 编辑.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 存储库中获取该单元的最新版本。

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

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

不要使用目标编辑器进行编辑,而是使用出色的 "Target Platform Definition DSL and Generator"反而。它允许您更明智地编辑目标文件。在上面的例子中,你可以使用 lazy version 关键字来指定你想要 0.0.0 作为版本号。它看起来像这样:

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

两全其美

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

关于java - 如何避免 eclipse 目标定义中的特定功能版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33646330/

相关文章:

JAVA_HOME 指向错误的 JDK

tomcat - osgi 包已解决但在运行时出现异常不受支持的 major.minor 版本 51.0

java - 修改二叉树的 LCA 代码以检查节点是否存在于 Java 中

Java OutOfMemory 异常时剪贴板

java - Spark : createDataset() into a Dataset<Row>?

java - 如何使用 Java 8 流向列表中的项目字段添加值

java - java eclipse 中的单步进入和单步跳过按钮禁用

Java - 在默认包中找不到符号

java - 在 Karaf OSGI 中,我收到抛出异常的包中的类的 ClassNotFoundException

java - osgi + felix 入门