Multi-module Maven 依赖使用存储库,而不是 Travis 本地 CI

Multi-module maven dependency using repository, not local on Travis CI

我有一个 multi-module 项目,其中两个子模块之一依赖于另一个。 This question 意味着 mvn install 应该处理这些依赖关系。

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

问题与 非常相似,只是我处理的不是我的本地存储库,而是 Travis CI 自动构建。该问题的评论和回答表明:

The dependency has a snapshot version. For snapshots, Maven will check the local repository and if the artifact found in the local repository is too old, it will attempt to find an updated one in the remote repositories.

但是,在这种情况下,"too old" 不适用。本地神器实际上是刚刚建成。它应该是几秒钟前的。

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

<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>

以及 parent 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 中引用的 class;但是,class 在提交的拉取请求中,它在本地编译(并使用 mvn install 构建)。

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

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

反应堆按顺序正确安排构建:

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

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

[INFO] Building jar: /home/travis/build/dblock/oshi/oshi-core/target/oshi-core-3.0-SNAPSHOT.jar

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

[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/com/github/dblock/oshi-core/3.0-SNAPSHOT/oshi-core-3.0-20160624.032041-9.jar

[INFO] Downloaded: 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 at 708.5 KB/sec)

编辑: 刚刚注意到在下载之前出现的以下警告,可能相关也可能不相关(an error in Travis settings) however, fixing that warning still doesn't resolve my problem, here's a failed build without the warning

[WARNING] Failure to transfer com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml from https://nexus.codehaus.org/snapshots/ was cached in the local repository, resolution will not be reattempted until the update interval of codehaus-snapshots has elapsed or updates are forced. Original error: Could not transfer metadata com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml from/to codehaus-snapshots (https://nexus.codehaus.org/snapshots/): nexus.codehaus.org

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

有什么方法可以告诉 Travis CI 使用它刚刚编译的 jar 而不是下载一个新的 jar -- 并且这样做的方式不会破坏预期的下载发布后来自存储库的依赖项?

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

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

您已在默认生命周期内将 maven-source-plugin 配置为 运行,这意味着它会 运行 每个 mvn clean packagemvn install 这是通常不需要,因为通常只有在发布并传输到 Maven Central 时才需要源包。除此之外,您还配置了使用 maven-source-plugin 的 jar 目标,它分叉了生命周期,这意味着从头开始一些部分。最好remove the forked life cycle goal. Best is to add source packages only during the release run。 (请注意,您已关闭使用发布配置文件)。

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

出于什么原因,您将配置 wagon-ssh 作为扩展?这样做的目的是什么?如果要将生成的网站发布到 github,最好选择 Maven SCM Publish Plugin is much 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 的配置,并且可能是其他与分发相关的信息,如脚本等。并且创建应该像 [=28 这样处理=].这与关注点分离有关。为什么生成的网站应该是这个的一部分?

顺便说一句:在 <build><plugins>... 中定义的每个插件都将继承给所有子项并执行,这通常不是正确的方法。执行的插件应由 pom 中给出的适当包装类型定义。

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

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