如何在所有模块构建完成后执行maven插件

Posted

技术标签:

【中文标题】如何在所有模块构建完成后执行maven插件【英文标题】:How to execute maven plugin _after_ all module builds finish 【发布时间】:2011-12-04 11:44:51 【问题描述】:

具体来说,我正在尝试运行 maven-javadoc-plugin 但是每当我更改父/聚合器 pom 和所有子级的版本号时,我第一次运行构建时它会失败,因为 javadoc 首先运行并且不能从模块中找到任何新版本的包,因为它们尚未构建。

我通常最终不得不为一个构建注释 javadoc,然后在新版本的 nexus 中提供包后将其重新添加。然而,这可能意味着我一直在一个构建旧的源 jar 上构建 javadoc。

我已经阅读了将另一个模块放入依赖于其他模块的建议,但我认为我无法获得一个模块来为对等模块构建 javadoc。将它放在父级中会为所有模块构建所有 javadoc,我只需要它稍后发生。谢谢。这是我的 javadoc 插件配置。

                    <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <inherited>false</inherited>
                    <executions>
                        <execution>
                            <id>generate-javadoc</id>
                            <phase>package</phase>
                            <goals>
                                <goal>aggregate</goal>
                            </goals>
                            <configuration>
                                <aggregate>true</aggregate>
                                <links>
                                    <link>http://java.sun.com/javase/6/docs/api</link>
                                    <link>http://java.sun.com/javaee/5/docs/api</link>
                                </links>
                                <maxmemory>512</maxmemory>
                                <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>
                                <docletArtifact>
                                    <groupId>org.umlgraph</groupId>
                                    <artifactId>doclet</artifactId>
                                    <version>5.2</version>
                                </docletArtifact>
                                <additionalparam>
                                    -inferrel -inferdep -outputencoding utf8 -hide
                                    java.* -collpackages
                                    java.util.*
                                    -qualify -postfixpackage
                                    -nodefontsize 9 -nodefontpackagesize 7
                                </additionalparam>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

【问题讨论】:

尝试阶段安装而不是执行包 安装阶段似乎没有帮助,因为父/聚合器项目首先按反应器顺序构建,因此它的所有阶段都在构建任何模块之前运行。因此,无论是安装还是打包,它都是在构建第一个模块之前完成的,因此 javadoc 对模块的依赖关系不满足,因为它们没有被构建。 【参考方案1】:

解决此问题的一种方法是在正常的 maven 生命周期阶段调用 javadoc 插件;而是单独运行它。

具体来说,从上面的plugin 定义中删除&lt;phase&gt; 标签。

从父级运行mvn install javadoc:javadoc

这将构建和安装所有模块和父模块,然后在它们上运行 javadoc。

【讨论】:

感谢您的回复,虽然很遗憾这不是一回事。通过上面的配置,我在***目标目录中获得了一个 site/apidocs 目录,其中所有模块 javadoc 在一个地方。如果我按照您的建议进行操作,则每个模块都构建自己的 javadoc,但并不是所有模块的*** javadoc。 @约翰。我猜javadoc:javadoc 不会聚合。也许javadoc:aggregate 可以? 非常感谢您的回复。确实如此,但是由于*** pom 在反应器顺序中首先运行,因此尚未构建任何其他模块,并且 javadoc 插件认为它们都是依赖项,因此它会中断说它找不到必要的 jar。鉴于此,我不确定聚合将如何工作。有没有办法让反应堆顺序中的*** pom LAST ?如果它是第一个,我不明白为什么它不会总是试图找到尚未构建的模块的工件。 @John,我的意思是mvn clean install javadoc:aggregate 再次感谢。我认为的问题是我的构建的反应堆顺序首先是*** pom,然后是所有模块。所以我在顶层 pom(也是模块的父 pom)中尝试做的任何事情都是在构建所有模块之前完成的。我现在正在四处寻找方法来切换*** pom 的反应器顺序,但我并没有寄予厚望。我也在尝试另一个依赖于所有其他模块并构建 javadoc 的模块,但这非常蹩脚。嗯嗯。【参考方案2】:

你的 javadoc 插件声明在你的 pom.xml 的 &lt;build&gt; 部分中吗?您应该考虑将其移至&lt;reporting&gt; 部分,请参阅此link。

【讨论】:

您不能在报告期间运行任意插件。 &lt;reporting&gt;&lt;plugins&gt;&lt;plugin&gt;&lt;executions&gt; 甚至在 POM 模式中都无效。 看来你是对的。我认为构建和报告之间的 javadoc 插件的行为是相同的,因为在文档中写到,在项目报告的情况下,您应该将其放在报告部分,但在这种情况下它显然不起作用,因为xsd 禁止它。官方文档只有配置部分,没有执行部分。我的错。

以上是关于如何在所有模块构建完成后执行maven插件的主要内容,如果未能解决你的问题,请参考以下文章

ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

ANTLR4入门:使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

在父模块上执行 Maven 插件目标,但不在子模块上

Jenkins Git插件分离了HEAD

maven生命周期和插件

Maven 发布插件:如何在发布时仅部署分发 jar:执行