我有一个多模块项目,其中两个子模块中的一个依赖于另一个。这个问题意味着mvn install应该处理这些依赖关系。
在我的机器上(包括Eclipse内部和命令行),在本地级别上一切都很好。但是,当我更新更改第二个模块需要的代码并提交到我的github存储库的模块时,第二个模块失败了Travis CI构建。我将问题追溯到这样一个事实,即它正在从存储库下载它的依赖项,而不是使用它刚刚编译的存储库。
这个问题与在这个问题中报告的那个非常相似,只是我处理的不是本地存储库,而是Travis自动构建。对这一问题的评论和答复表明:
该依赖项具有快照版本。对于快照,Maven将检查本地存储库,如果在本地存储库中找到的工件太旧,它将尝试在远程存储库中找到更新的工件。
然而,在这种情况下,“太老”不应该适用。当地的艺术品是刚刚建成的。应该是几秒钟前的。
下面是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>完整的文件可在这里查阅:
日志文件的相关摘录如下所示。一个完整的失败的Travis CI构建可以在这里找到示例。注意,症状(编译错误)是Travis使用oshi-core的最新快照的结果,该快照不包括oshi-json中引用的类;然而,类在提交的拉请求中,它在本地编译(并使用mvn安装进行编译)。
当我进行新的提交时,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,在本地存储编译的代码:
信息构建jar: /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)
编辑:刚刚注意到在下载之前发生的以下警告,这可能是相关的,也可能不相关(Travis设置中的错误),但是,修复该警告仍然不能解决我的问题,这里有一个没有警告的失败的构建
在本地存储库中缓存了从com.github.dblock:oshi-core:3.0-SNAPSHOT/maven-metadata.xml传输https://nexus.codehaus.org/snapshots/的警告失败,在codehaus-快照的更新间隔过去或强制更新之前,不会重新尝试解析。原始错误:无法将元数据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使用jar编译,而不是下载一个新的1来做到这一点,这样就不会破坏存储库中的依赖关系的预期下载。
发布于 2016-06-26 11:20:25
因此,好吧,我已经对您的构建做了更深入的研究,让我在这里总结一下我的一些想法:
我发现您已经用不同的值配置了maven-洁净插件,这些值是不必要的,它们也没有优势。使用Convention over Configuration范式。只有当你有真正的理由时才违反它(老实说,我一个也没看到。也许你可以解释一下)。
您已经将Maven源代码插件配置为在默认生命周期中运行,这意味着它将与每个mvn clean package一起运行,或者使用通常不需要的mvn install运行,因为只有在发布并传输到Maven Central时才需要源代码包。除此之外,您还配置了使用maven源代码插件的jar目标,这将创建生命周期,这意味着从一开始就开始执行某些部分。最好的拆卸分叉的生命周期目标。最好是只添加源包在发布过程中。(请注意,您已关闭使用发布配置文件)。
那么来看看maven-javadoc插件吧。您已经绑定了它,以便它每次通过mvn clean package或mvn install运行。我建议只在site生命周期中运行,因为生成javadoc需要很长时间.
出于什么原因,您有配置车-ssh作为扩展?这样做的目的何在?如果要将生成的站点发布到github,最好在Maven SCM发布插件上使用越简单越快。
您还使用一些奇怪的属性src.relative.loc配置了maven程序集插件。如果您确实有一个可以重用的描述符,那么您应该查看一下关于共享描述符的文档。将maven-程序集插件声明到父程序中意味着它将对所有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] Ah...very重要:您使用的是目标assembly,这是不推荐的,不应该使用。使用现有的唯一一个:single,而不是其他。因为assembly也分叉了生命周期,这减慢了构建的速度。
我不知道你喜欢在这里生产什么?二进制分发包?如果是这样的话,您应该创建一个单独的模块,这个模块名为oshi-dist,它包含maven程序集插件的配置,可能是其他发行版相关的信息,比如脚本等等。这与关注点的分离有关。为什么生成的站点应该是其中的一部分?
顺便说一句:在<build><plugins>...中定义的每个插件都将被继承到所有的子程序中,并将被执行,这通常不是正确的方法。执行的插件应该由pom中给出的适当的打包类型来定义。
更新:为什么要配置maven-scm插件?
更新2:我创建了一个PR ..so,您可以深入了解我的建议.也许我错过了你需要的某些部分。
https://stackoverflow.com/questions/38021248
复制相似问题