如何在不重新生成javadoc的情况下聚合maven子项目javadoc输出

时间:2017-07-19 16:48:11

标签: java maven javadoc maven-javadoc-plugin

我有一个较大的多模块Maven构建。我需要为所有模块生成javadoc并生成一个"聚合的" javadoc结果我可以部署到一个盒子供用户使用。

我确实在很长一段时间内完成了这项工作,直到我尝试实现具有特定功能和要求的自定义标记,这使得生成更加复杂。

所有子模块都继承了不是聚合器pom的父pom。在那个父pom中我定义了maven-javadoc-plugin。这是我添加自定义标记之前的样子:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.4</version>
            <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
                <bottom>Unified Service Layer - bottom</bottom>
                <doctitle>Unified Service Layer - title</doctitle>
                <footer>Unified Service Layer - footer</footer>
                <groups></groups>
                <header>Unified Service Layer - header</header>
                <level>public</level>
                <packagesheader>Unified Service Layer - packagesheader</packagesheader>
                <top>Unified Server Layer - top</top>
                <windowtitle>Unified Service Layer - windowtitle</windowtitle>
            </configuration>
            <executions>
                <execution>
                    <id>module-javadoc-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <show>protected</show>
                        <detectLinks>false</detectLinks>
                    </configuration>
                </execution>
                <execution>
                    <id>aggregated-documentation</id>
                    <phase>package</phase>
                    <inherited>false</inherited>
                    <goals>
                        <goal>aggregate-jar</goal>
                    </goals>
                    <configuration>
                        <show>protected</show>
                        <detectLinks>false</detectLinks>
                    </configuration>
                </execution>
            </executions>
        </plugin>

有了这个,我可以构建所有的模块,这将生成自己的javadoc(我现在知道它只是一个验证步骤,因为aggregate-jar不使用此输出)。我有一个单独的步骤,我从jenkins调用运行&#34; javadoc:aggregate-jar&#34;在根项目中,它生成我部署的聚合javadoc jar。

此外,到现在为止,这一直很好。

我实现了一个自定义的javadoc标记,它需要访问与其所包含的源文件关联的Class对象。我通过在上面的配置中添加以下内容,至少在单个模块构建中实现了这一点:

                <taglets>
                    <taglet>
                        <tagletClass>com.att.det.taglet.ValidationConstraintsTaglet</tagletClass>
                    </taglet>
                    <taglet>
                        <tagletClass>com.att.det.taglet.ValidationConstraintsCombinedTaglet</tagletClass>
                    </taglet>
                </taglets>
                <tagletArtifacts>
                    <tagletArtifact>
                        <groupId>com.att.detsusl.taglets</groupId>
                        <artifactId>validationJavadocTaglet</artifactId>
                        <version>0.0.1-SNAPSHOT</version>
                    </tagletArtifact>
                </tagletArtifacts>

为了让taglet可以访问类文件,我必须为每个子项目pom.xml添加一个最小的插件配置,如下所示:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
                <tagletArtifacts combine.children="append">
                    <tagletArtifact>
                        <groupId>com.att.detsusl</groupId>
                        <artifactId>artifact-name</artifactId>
                        <version>${current.pom.version}</version>
                    </tagletArtifact>
                </tagletArtifacts>
            </configuration>
        </plugin>

通过这些最小的更改,我可以在每个模块中运行构建,生成javadoc,并检查每个模块中生成的javadoc输出,验证它是否都有效。

然而,问题是,当我运行&#34; javadoc:aggregate-jar&#34;在根项目中,将忽略所有已构建的输出。它重新运行所有子项目的javadoc生成,同时忽略每个子项目pom.xml文件中附加的tagletArtifacts列表。结果,我在尝试获取类文件时遇到ClassNotFound错误。

我可以&#34;修复&#34;通过将所有子项目GAV放入顶级&#34; tagletArtifacts&#34;列表,但我绝对不想那样做。我喜欢在子项目pom.xml中指定它的功能(使用combine.children =&#34;追加&#34;)以使其工作。

我需要的是所有子项目的整体javadoc包,taglet能够访问类文件,而不必强制父pom知道它的所有子项目。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我面临所有聚合目标的同样问题。我检查了源代码maven-javadoc-plugin,结果表明通过遍历子模块和收集源文件进行聚合工作,因此完全忽略了子模块中指定的任何表单配置。

在执行期间,每个子模块都被完全忽略: source

if ( isAggregator() && !project.isExecutionRoot() ) {
    return;
}

在收集源文件期间,遍历了子模块:source

if ( isAggregator() && project.isExecutionRoot() ) {
    for ( MavenProject subProject : reactorProjects ) {
        if ( subProject != project ) {
            List<String> sourceRoots = getProjectSourceRoots( subProject );

所以目前,没有办法做到这一点。

这很难修复,因为整个插件通过组合对实际javadoc工具的单个调用来工作。如果您还想尊重子模块中的设置,则必须合并它们的配置块。虽然这适用于tagletArtifacts的情况,但它不适用于您可以指定的所有设置,例如任何形式的过滤器,因此不能以通用方式完成。