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(); ... }
这里有代码感兴趣的人