【问题标题】:Maven tries download multimodule dependency on `validate` phaseMaven 尝试在“验证”阶段下载多模块依赖项
【发布时间】:2020-09-18 23:05:40
【问题描述】:

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

pom.xml:

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

lib/pom.xml

 <version>1.2.3</version>

app/pom.xml

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

所以,如果我这样做 mvn compile 它工作正常。

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

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

mvn compile

[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 validate

[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]

【问题讨论】:

  • 你是在主目录运行还是从子目录运行?
  • 从 main,父 pom 所在的地方

标签: java maven build


【解决方案1】:

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

因此,您有两个解决方案:始终使用 compile 运行,或者如果需要工件,则将执行块绑定到 compile-pahse。

【讨论】:

  • 对不起,我不明白第二种解决方案。你是什​​么意思?第三个解决方案是更改执行器插件以包含requiresDependencyResolution?为什么一开始就不做呢?有什么缺点吗?
  • enforce-reactorcompileenforce 这将在compiler:compile 之后执行,这意味着这些依赖项将可用。总是需要依赖是没有意义的,因为对于大多数规则你不需要依赖,但你确实希望尽快得到反馈。真正的解决方案是改进 Maven。
  • 那么,您是建议将强制插件移至编译阶段吗?重点是什么? mvn compile 已经可以正常工作了。
  • 你有一些依赖于编译范围依赖的规则。最简单的解决方法是仅将这些规则放在强制插件中的单独执行块中,如我之前的答案所示。通过这样做,mvn validate 应该会再次工作。
  • 因为那些依赖还没有被构建。
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2013-10-12
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多