使用存储库的多模块maven依赖关系,而不是Travis CI上的本地

时间:2016-06-24 20:01:39

标签: maven dependencies travis-ci multi-module

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

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

问题与the one reported in this question非常相似,不同之处在于我正在处理Travis CI自动构建,而不是我的本地存储库。对该问题的评论和回答表明:

  

依赖项具有快照版本。对于快照,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中引用的类;但是,该类位于提交的pull请求中,并在本地编译(并使用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

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

  

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

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

  

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

     

[INFO]已下载:   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 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 - 这样做的方式不会破坏从存储库中预期的依赖下载它发表了吗?

1 个答案:

答案 0 :(得分:2)

好的,我已经深入研究了你的构建,让我总结一下我的一些想法:

我发现您已为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。最好只添加源包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的配置,可能是其他与分发相关的信息,如脚本等。而且创建应该像{{3一样处理}}。这与关注点分离有关。为什么生成的网站应该是其中的一部分?

BTW:<build><plugins>...中定义的每个插件都将继承给所有子节点,并且将被执行,这通常不是正确的方法。执行的插件应该由pom中给出的适当的包装类型定义。

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

更新2:我创建了一个PR ..所以你可以深入了解我的建议......可能是我错过了你需要的一些部分..