我有一个更大的多模块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了解它的所有子项目。我该怎么做呢?
发布于 2017-09-15 18:04:22
我面临着与所有总体目标相同的问题。我检查了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,但它不适用于您可以指定的所有设置,例如任何形式的过滤器,因此无法以通用方式完成。
https://stackoverflow.com/questions/45196494
复制相似问题