【问题标题】:Multi-module maven dependency using repository, not local on Travis CI使用存储库的多模块 Maven 依赖项,而不是 Travis CI 上的本地
【发布时间】:2016-10-27 12:52:53
【问题描述】:

我有一个多模块项目,其中两个子模块之一依赖于另一个。 This question 暗示 mvn install 应该处理这些依赖关系。

在我的机器上(在 Eclipse 和命令行中)本地级别一切正常。但是,当我更新更改第二个模块所需代码的模块并提交到我的 github 存储库时,第二个模块无法通过 Travis CI 构建。我已经将问题追溯到它是从存储库下载其依赖项而不是使用它刚刚编译的那个。

这个问题与the one reported in this question 非常相似,只是我处理的是 Travis CI 自动构建,而不是我的本地存储库。该问题的 cmets 和答案表明:

依赖项有一个快照版本。对于快照,Maven 将检查 本地存储库以及是否在本地存储库中找到工件 太旧,它会尝试在遥控器中找到更新的 存储库。

但是,在这种情况下,“太旧”不应该适用。本地工件实际上是刚刚构建的。它应该是几秒钟前的。

这里是 oshi-json 模块的 pom.xml 的相关部分,注意它对 oshi-core 的依赖(两者都与父级共享它们的版本号):

<parent>
    <groupId>com.github.dblock</groupId>
    <artifactId>oshi-parent</artifactId>
    <version>3.0-SNAPSHOT</version>
</parent>

<artifactId>oshi-json</artifactId>
<packaging>jar</packaging>

<name>oshi-json</name>

<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>oshi-core</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

还有来自父 pom.xml 的摘录:

<groupId>com.github.dblock</groupId>
<artifactId>oshi-parent</artifactId>
<version>3.0-SNAPSHOT</version>
<packaging>pom</packaging>

<name>oshi-parent</name>

<modules>
    <module>oshi-core</module>
    <module>oshi-json</module>
</modules>

完整的文件在这里:

日志文件的相关摘录如下所示。 failed Travis CI build can be found here 的完整示例。请注意,症状(编译错误)是 Travis 使用 oshi-core 的最新快照的结果,其中不包括 oshi-json 中引用的类;但是,该类在提交的拉取请求中,它在本地编译(并使用 mvn install 构建)。

当我进行新的提交时,Travis 按如下方式执行构建:

$ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V

reactor 正确地按顺序排列构建:

[INFO] Reactor Build Order:
[INFO] 
[INFO] oshi-parent
[INFO] oshi-core
[INFO] oshi-json

父构建,然后oshi-core构建,将编译后的代码存储在本地:

[INFO] 建筑罐子: /home/travis/build/dblock/oshi/oshi-core/target/oshi-core-3.0-SNAPSHOT.jar

这是我希望下一个模块依赖的 jar。但是,当oshi-json 构建开始时,它会改为从 maven 下载工件:

[信息] 下载: https://oss.sonatype.org/content/repositories/snapshots/com/github/dblock/oshi-core/3.0-SNAPSHOT/oshi-core-3.0-20160624.032041-9.jar

[信息] 已下载: https://oss.sonatype.org/content/repositories/snapshots/com/github/dblock/oshi-core/3.0-SNAPSHOT/oshi-core-3.0-20160624.032041-9.jar (199 KB,708.5 KB/秒)

编辑:刚刚注意到在下载之前发生的以下警告,可能相关也可能不相关(an error in Travis settings)但是,修复该警告仍然不能解决我的问题, here's a failed build without the warning:

[警告] 传输失败 com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml 来自 https://nexus.codehaus.org/snapshots/ 被缓存在本地 存储库,在更新之前不会重新尝试解析 codehaus-snapshots 的间隔已经过去或强制更新。 原始错误:无法传输元数据 com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml 从/到 codehaus 快照 (https://nexus.codehaus.org/snapshots/): nexus.codehaus.org

这是一个仅与 Travis-CI 相关的临时问题;一旦我真正发布了所有模块,pom 设置就会正常工作,我可以通过在本地执行 mvn clean deploy 将新的 oshi-core 推送到 OSS 存储库来解决它,这样 Travis 很高兴。但是,这似乎是一个糟糕的解决方法。

有没有一种方法可以告诉 Travis CI 使用它刚刚编译的 jar,而不是下载一个新的 jar——并且这样做的方式不会破坏从存储库中预期下载的依赖项出版了吗?

【问题讨论】:

  • 您能否从所有相关模块中提供 pom 文件,否则很难说有用的东西。在多模块构建期间,它不应该从任何地方下载任何东西,因为它将从反应堆中解决。
  • @khmarbaise 我扩展了摘录并链接到我的 github 站点上的原始 pom(和失败的构建)。如果您愿意,您或许可以fork the upstream project 在本地进行实验。

标签: maven dependencies travis-ci multi-module


【解决方案1】:

好吧,我已经深入了解了您的构建,让我在这里总结一下我的一些想法:

我发现您为maven-clean-plugin 配置了不同的值,这些值不是必需的,也没有优势。使用Convention over Configuration 范式。仅在您有充分理由的情况下才违反它(老实说,我没有看到。也许您可以解释一下)。

您已将 maven-source-plugin 配置为在默认生命周期内运行,这意味着它将与每个 mvn clean packagemvn install 一起运行,这通常不是必需的,因为通常只有在您这样做时才需要源包发布并转移到 Maven 中心。除此之外,您已配置为使用 maven-source-plugin 的 jar 目标,它分叉生命周期,这意味着从头开始某些部分。最好remove the forked life cycle goal。最好只添加源包during the release run。 (请注意,您已关闭使用发布配置文件)。

所以来maven-javadoc-plugin。您已绑定它,以便它每次都通过mvn clean packagemvn install 运行。我建议仅在 site 生命周期中运行它,因为生成 javadoc 需要很长时间...

出于什么原因,您将配置 wagon-ssh 作为扩展?这样做的目的是什么?如果要将生成的站点发布到 github,最好在 Maven SCM Publish Plugin 是很多 more simpler and faster

您还为 maven-assembly-plugin 配置了一些奇怪的属性 src.relative.loc。如果你真的有一个可以重复使用的描述符,你应该看看documtation about shared descriptors。将 maven-assembly-plugin 声明到父级意味着它将为所有 pom 执行,包括在您的构建中产生以下警告的父级:

[INFO] --- maven-assembly-plugin:2.6:assembly (oshi-assembly) @ oshi-parent ---
[WARNING] Cannot include project artifact: com.github.dblock:oshi-parent:pom:3.0-SNAPSHOT; it doesn't have an associated file or directory.
[INFO] Building tar: /Users/kama/ws-git-so/oshi/target/oshi-parent-3.0-SNAPSHOT-oshi-assembly.tar.gz
[WARNING] Cannot include project artifact: com.github.dblock:oshi-parent:pom:3.0-SNAPSHOT; it doesn't have an associated file or directory.
[INFO] Building tar: /Users/kama/ws-git-so/oshi/target/oshi-parent-3.0-SNAPSHOT-oshi-assembly.tar.bz2
[WARNING] Cannot include project artifact: com.github.dblock:oshi-parent:pom:3.0-SNAPSHOT; it doesn't have an associated file or directory.
[INFO] Building zip: /Users/kama/ws-git-so/oshi/target/oshi-parent-3.0-SNAPSHOT-oshi-assembly.zip
[INFO]                                                                         

啊...非常重要:您正在使用目标assembly,该目标已被弃用且不应使用。使用唯一现有的:single 没有别的。因为assembly 也在分叉生命周期,这会减慢您的构建速度。

我不确定你喜欢在这里制作什么?二进制分发包?如果是这样,您应该创建一个名为 oshi-dist 的单独模块,其中包含 maven-assembly-plugin 的配置,并且可能是其他与分发相关的信息,如脚本等。创建应该像 this 一样处理。这与关注点分离有关。为什么生成的站点应该是其中的一部分?

顺便说一句:在&lt;build&gt;&lt;plugins&gt;... 中定义的每个插件都将被继承给所有子节点并执行,这通常不是正确的方式。执行的插件应该由 pom 中给出的适当的包装类型定义。

更新:为什么要配置 maven-scm-plugin ?

更新 2:我创建了一个 PR ..所以您可以更深入地了解我的建议...可能是我错过了您的某些需求..

【讨论】:

  • 感谢详细的 cmets 和 PR。大多数 pom 是从另一个项目中借来的,并在大约一年前为单个项目构建配置;您注意到的一些问题是因为我只是试图将事情分开并让多模块构建工作。我会看看这些更改是否能解决本地与存储库的问题。
  • 看来新的 pom 设置解决了我的问题,谢谢!没有一步一步地查看究竟是哪个错误导致的(可能是maven源插件设置)。我将继续根据您的建议改进 pom,但主要问题已解决。
  • @khmarbaise 我欠你一杯啤酒
猜你喜欢
  • 2016-12-22
  • 2014-09-28
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多