2017-07-19 55 views
1

我有一个庞大的多模块Maven构建版本。我需要为所有模块生成javadoc,并生成一个“聚集的”javadoc结果,我可以将其部署到一个框中供用户使用。如何在未重新生成javadoc的情况下聚合Maven子项目javadoc输出

我确实在这段时间内工作得非常好,直到我尝试实现具有特定功能和要求的自定义小标签,这使得这更加复杂。

所有子模块都继承了不是聚合器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(我现在知道的只是一个验证步骤,如聚集jar不使用这个输出)。我有一个单独的步骤,我从jenkins调用,在根项目中运行“javadoc:aggregate-jar”,它生成我部署的聚合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输出,验证它所有的工作。

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

我可以通过将所有子项目GAV放入顶层“tagletArtifacts”列表中来“解决”这个问题,但我绝对不希望这样做。我喜欢能够在子项目pom.xml中指定它(with combine.children =“append”)以使其工作。

我需要的是一个用于所有子项目的整体javadoc包,其中小标签能够访问类文件,而不会强制父pom知道其所有子项目。我怎样才能做到这一点?

回答

0

我面临着与所有总目标相同的问题。我检查了源代码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,但它不适用于您可以指定的所有设置,例如,任何形式的过滤器,因此不能以通用的方式完成。