在构建管道中,我想为 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/