【发布时间】:2017-07-19 16:48:11
【问题描述】:
我有一个较大的多模块 Maven 构建。我需要为所有模块生成 javadoc 并生成一个“聚合的”javadoc 结果,我可以将其部署到一个盒子以供用户使用。
在我尝试实现具有特定功能和要求的自定义 taglet 之前,我确实让这个工作得很好很长一段时间,这使得它的制作变得更加复杂。
所有子模块都继承了一个不是聚合器 pom 的父 pom。在那个父 pom 中,我定义了 maven-javadoc-plugin。这是我添加自定义 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(我现在知道这只是一个验证步骤,因为 aggregate-jar 不使用此输出)。我从 jenkins 调用了一个单独的步骤,该步骤在根项目中运行“javadoc:aggregate-jar”,它生成了我部署的聚合 javadoc jar。
同样,到目前为止,这一直运行良好。
我实现了一个自定义 javadoc taglet,它需要访问与其包含的源文件关联的 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 输出,验证一切是否正常。
但是,问题是,当我在根项目中运行“javadoc:aggregate-jar”时,所有已经构建的输出都被忽略了。它为所有子项目重新运行 javadoc 生成,同时忽略每个子项目 pom.xml 文件中附加的 tagletArtifacts 列表。结果,当它尝试获取类文件时,我得到了 ClassNotFound 错误。
我可以通过将所有子项目 GAV 放入顶级“tagletArtifacts”列表来“解决”这个问题,但我绝对不想这样做。我喜欢在子项目 pom.xml(使用 combine.children="append")中指定它以使其工作的能力。
我需要的是所有子项目的整体 javadoc 包,taglet 能够访问类文件,而无需强制父 pom 了解其所有子项目。我该怎么做?
【问题讨论】:
标签: java maven javadoc maven-javadoc-plugin