java - Maven 尝试在 `validate` 阶段下载多模块依赖

标签 java maven build

在构建管道中,我想为 enforcer 插件之类的东西运行 validate 阶段。但是,它不适用于多模块项目,因为它会尝试从项目内部的存储库下载依赖项。然而,compile 阶段不会这样做,但对我来说这不是一个选项,因为它太慢了。

pom.xml:

<module>lib</module>
<module>app</module>

lib/pom.xml

 <version>1.2.3</version>

应用程序/pom.xml

 <dependency>
   <artifactId>lib</artifactId>
   <version>1.2.3</version>
 </dependency>

所以,如果我执行 mvn compile 它工作正常。

但是如果我执行 mvn validate 它无法验证 app 模块,因为它会尝试从 Maven 存储库下载 lib-1.2.3。由于某种原因,它现在看不到该库是邻居依赖项。为什么?

我创建了一个小型存储库:https://github.com/kan-izh/so63963768

mvn 编译

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) @ app ---
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ app ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Workspace\repo\so63963768\app\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ app ---
[INFO] No sources to compile
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] parent ............................................ SUCCESS [1.612s]
[INFO] lib ............................................... SUCCESS [1.224s]
[INFO] app ............................................... SUCCESS [0.056s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

mvn 验证

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) @ app ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] parent ............................................ SUCCESS [0.979s]
[INFO] lib ............................................... SUCCESS [0.015s]
[INFO] app ............................................... FAILURE [0.020s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.180s
[INFO] Finished at: Wed Sep 23 11:27:38 BST 2020
[INFO] Final Memory: 7M/34M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) on project app: Execution
 enforce-no-snapshots of goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce failed: org.apache.maven.shared.dependency.graph.
DependencyGraphBuilderException: Could not resolve following dependencies: [com.so.q63963768:lib:jar:1.2.3 (compile)]: Could not resolve depend
encies for project com.so.q63963768:app:jar:1.2.3: Failure to find com.so.q63963768:lib:jar:1.2.3 in http://xxxxxxxxxxxxx.xx.xxxxxxxxxxxxxxxxx.
com:8081/repository/maven-public/ was cached in the local repository, resolution will not be reattempted until the update interval of nexus has
 elapsed or updates are forced -> [Help 1]

最佳答案

这是一个很好的问题,它显示了 Maven 如何处理依赖关系的一个小缺陷。 您需要知道,对于每个插件目标,您都可以定义是否应解决依赖关系以及解决范围。 (如果只有 poms 就足够了,或者你还需要 Artifact ,那会有一点不同) compiler:compile需要编译期间所需的依赖项,compiler:testCompile需要测试期间所需的依赖项。 对于执行目标,它是棘手的:目标本身不需要解决依赖关系,大多数规则(如 requireJavaVersion 或 requireMavenVersion)也不需要,但有些规则需要,比如您尝试执行的规则。 理想情况下,规则可以定义它们是否需要解决依赖关系,但目前 API 不支持该功能。

因此您有几个解决方案:始终使用编译运行,或者如果需要 Artifact ,则将执行 block 绑定(bind)到编译阶段。

关于java - Maven 尝试在 `validate` 阶段下载多模块依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63963768/

相关文章:

maven - 禁用 Maven 执行调试输出

java - Cloudera Quickstart VM illegalArguementException : Wrong FS: hdfs: expected: file:

java - 如何修复 java.lang.IllegalStateException : You have not started an Objectify context

java - Java 中的搜索引擎?

java - 在 Java 8 上为 Maven 单元测试设置时区

java - 如何清理 Maven 存储库(在 Amazon S3 上)?

java - Gradle 传递依赖解析到 alpha 版本?

android - Android 应用程序的 TFS 自动build设置

windows - ANT 构建脚本如何终止 Windows 进程?

java - 将焦点放在 Selenium 中外部启动的浏览器上