这似乎是一个简单的问题,但由于 maven 极其严格的生命周期和阶段范式,我发现它很困难:
假设在一个多模块的 maven 项目中,在各个阶段使用了几个插件来将 pom.xml 重写为更有效的版本,值得注意的例子是:
maven-shade-plugin(如果
<createDependencyReducedPom>
启用):当需要发布着色的 uber-jar 时,插件可以摆脱不需要包含的依赖项。始终在包阶段执行。flatten-maven-plugin:允许模块发布的 pom.xml 不再依赖于父级的 pom,方法是将属性引用替换为它们的实际值。可以在任何阶段执行,但为了保持与 maven-shade-plugin 的互操作性,它也仅限于包阶段(请参阅https://issues.apache.org/jira/browse/MSHADE-323)
当它们与其他模块结合使用时,maven reactor 构建引擎似乎经常摸索使用哪个版本的重写 pom 来计算传递依赖。理想情况下,应该使用打包阶段之后的最终版本。但是在最新的 maven 版本(3.6.3)中,它只能在重写之前使用 pom.xml,不会减少依赖关系并且所有属性都没有正确替换。
我的问题是:
这个设计的意义何在?为什么在所有插件都明确替换它时使用半生不熟的 pom.xml?
如何覆盖此行为,以便始终生成和使用 pom.xml 的最终版本,而不管请求的 maven 目标如何?
更新1:目前我正在使用一个简单的规避方法:
将第一个模块拆分为一个独立的 maven 项目,在打包阶段调用 maven-shade 和 flatten-maven 插件。(我没有直接证据,但我怀疑这就是重新打包的依赖项(如
spark-project.hive
https://mvnrepository.com/artifact/org.spark-project.hive/hive-common )是如何制作的,请参阅https://issues.apache.org/ jira/browse/SPARK-20202进行相关讨论)使用 shell 脚本依次编译/发布上述项目和主多模块项目。
我不是 shell 脚本的忠实拥护者,我认为这背叛了 JVM 社区所珍视的与平台无关的壮举。因此,如果您有更好的解决方案,请在此处发布,我会根据受欢迎程度接受它。
非常感谢您的意见