当前位置: 首页 > 知识库问答 >
问题:

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

杜联
2023-03-14

我有一个更大的多模块Maven构建。我需要为所有模块生成javadoc,并生成一个“聚合”的javadoc结果,我可以将其部署到一个框中供用户使用。

在我尝试实现一个具有特定特性和需求的定制小标签之前,我已经有很长一段时间可以很好地完成这项工作了,这使得这项工作变得更加复杂。

所有子模块继承的父pom不是聚合器pom。在父pom中,我定义了maven javadoc插件。这是我添加自定义taglet之前的样子:

        <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(我现在知道这只是一个验证步骤,因为聚合jar不使用这个输出)。我从jenkins那里调用了一个单独的步骤,它在根项目中运行“javadoc:aggregate-jar”,生成我部署的聚合javadoc-jar。

同样,到目前为止,这种方法一直运行良好。

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

                <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输出,验证它是否都有效。

然而,问题是,当我在根项目中运行“javadoc:aggregate-jar”时,所有已经构建的输出都会被忽略。它为所有子项目重新运行javadoc生成,同时忽略每个子项目pom中附加的tagletArtifacts列表。xml文件。因此,当它尝试获取类文件时,我得到了ClassNotFound错误。

我可以通过将所有子项目GAVs放入顶级“tagletarti事”列表来“修复”它,但我绝对不想这样做。我喜欢在子项目pom.xml(使用combine.children=“append”)中指定它以使其工作的能力。

我需要的是所有子项目的整体javadoc包,标签能够访问类文件,而无需强制父pom知道其所有子项目。我该怎么做?

共有1个答案

萧英睿
2023-03-14

我在所有的总目标上都面临着同样的问题。我检查了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)的情况下有效,但它并不适用于您可以指定的所有设置,例如任何形式的过滤器,因此无法以通用方式完成。

 类似资料:
  • 我试图编译JavaDocs,使用: 我不断出现以下错误: 和 显然,我对多模块/聚合项目的依赖性没有得到认可。在我的一个模块pom中,这两个都标记为依赖项。xml文件。我需要在父pom中为maven javadoc plugin提供额外的参数吗。xml? 编辑: 我运行了mvn安装,它似乎可以工作。我的父母是pom。xml是: 这个版本已经过时了,但这似乎不是问题。

  • 我有一个使用Maven构建的多模块java项目,我想使用生成javadocs。项目结构如下所示: 我也在使用Project Lombok在项目中生成一些方法。我已经通过首先使用Lombok maven插件运行delombok成功地将其配置为与单个模块一起使用。对于单个模块(lomboklib),这将在 然后由maven-javadoc-plugin和javadoc工具处理。这最初是在这个SO问题中

  • 问题内容: 如果我用javadoc 编写,它不会出现,因为标签在格式化文本方面具有特殊功能。 如何在Javadoc中显示此字符? 问题答案: 您可以使用为 < 和为 > 。

  • 在我的maven pom中,我还定义了javadoc插件,如下所示: 现在我在运行过程中得到了一些奇怪的输出 [信息]生成“Javadoc”报告--maven-javadoc-plugin:3.1.0:aggregate-no-fork[ERROR]错误提取链接:d:\work\eclipse\java\fritzbox\phplib\target\javadoc-bundle-options。忽

  • 我们使用自定义doclet从自定义javadoc标记生成报告,并使用Maven站点插件和javadoc插件生成此报告和常规java API文档。 POM的部分如下所示: 在Maven 2下,这可以正常工作,但在Maven 3中只生成一个报告,这是POM中指定的最后一个报告(通过交换元素来分配)。 经过一些实验,我发现如果我将常规报告的目标从“javadoc”更改为“test javadoc”,那么

  • 编辑:我修好了。首先我删除了模块文件,然后创建了Javadoc。在完成这些操作之后,我再次配置了我的模块文件,并且它运行了错误的屏幕截图