Maven`help:effective-pom`仅为单个项目而非所有项目生成

我想为多模块构建中的所有子项目生成有效的pom。

help:effective-pom 这里 help:effective-pom文档说明

它将迭代当前构建会话中的所有项目,为每个项目打印有效的POM

我在这个maven项目的根目录中运行mvn help:effective-pom ,它只为root而不是子项目生成。

为什么不为所有项目生成有效的pom。 注意:我有另一个真实世界的maven项目,其中mvn help:effective-pom正确地为每个子模块生成带有标签。 我不确定为什么它不适用于这个maven项目

这是生成的有效pom

              4.0.0 org.gradle.test.performance project 1.0 pom  project0 project1 project2 project3 project4 project5 project6 project7 project8 project9     false  central Central Repository https://repo.maven.apache.org/maven2      never   false  central Central Repository https://repo.maven.apache.org/maven2    C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\java C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\scripts C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\test\java C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\classes C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\test-classes   C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\resources     C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\test\resources   C:\code\gradle-maven-transform\example\smallJavaMultiProject\target project-1.0    maven-antrun-plugin 1.3   maven-assembly-plugin 2.2-beta-5   maven-dependency-plugin 2.8   maven-release-plugin 2.3.2      maven-clean-plugin 2.5   default-clean clean  clean      maven-install-plugin 2.4   default-install install  install      maven-deploy-plugin 2.7   default-deploy deploy  deploy      maven-site-plugin 3.3   default-site site  site   C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site   org.apache.maven.plugins maven-project-info-reports-plugin      default-deploy site-deploy  deploy   C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site   org.apache.maven.plugins maven-project-info-reports-plugin       C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site   org.apache.maven.plugins maven-project-info-reports-plugin        C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site   

EffectivePomMojo是聚合器目标。 这意味着它仅针对您运行它的模块调用。 但你是对的,它应该转储所有的子项目。 它在你的情况下不这样做的原因是因为这一行:

 if ( projects.get( 0 ).equals( project ) && projects.size() > 1 ) 

在您的情况下,最上面的项目是图中的最后一个(因为它与任何其他模块没有依赖关系)。 如果你将它作为父项添加到project0(并且仅用于该模块),那么它将你的根pom放在图中的第一个位置,一切都将按预期工作。

我无法想出这种行为的理由。 因此,如果你在bugtracker中提出一个问题,那么每个人都会受益:)如果你得到答案,请更新我们。

PS:如果您知道如何调试Maven插件,这些问题很容易解决。 为此,您可以使用mvnDebug而不是mvn ,然后打开插件的源代码并附加到调试会话。

除了根项目中的modules元素之外,还需要在每个子模块pom.xml中指定parent元素,例如:

  org.gradle.test.performance project 1.0  

否则,在运行help:effective-pom命令时将无法获取它。

编辑:一些精确的插件无法与聚合一起使用的原因。 聚合 (使用modules元素完成)与inheritance (使用parent元素)不同。 但是插件文档清楚地提到:

有效-pom目标用于使插值,inheritance和活动配置文件的应用产生POM可见。

而且没有提到聚合插件。 我相信它基本上意味着:

我将采用你提供给我的pom,应用插值,inheritance和活动配置文件但不聚合,并给你生成的pom。 处理它。

我最终得到了一个不同的解决方案。 我不是接受单个根pom.xml作为输入,而是需要解析pom.xml的集合。 我现在还嵌入了maven-model-builder并通过DefaultModelBuildingRequest调用DefaultModelBuildingRequest

例如:

 DefaultModelBuilderFactory factory = new DefaultModelBuilderFactory(); DefaultModelBuilder builder = factory.newInstance(); ModelBuildingRequest req = new DefaultModelBuildingRequest(); req.setProcessPlugins(false); req.setModelResolver(createModelResolver()); req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); for (File pomFile : pomFiles) { req.setPomFile(pomFile); Model effectivePom = builder.build(req).getEffectiveModel(); ... } 

这里有代码感兴趣的人