【发布时间】: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 (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