2017-07-19 4 views
1

私は大規模なマルチモジュールMavenビルドを持っています。すべてのモジュールのjavadocを生成し、ユーザが消費するためにボックスにデプロイできる「集約された」javadoc結果を生成する必要があります。javadocを再生成せずにmavenサブプロジェクトのjavadoc出力を集める方法

特定の機能と要件を持つカスタムタグレットを実装しようとするまで、これは完璧にうまく動作しました。

すべてのサブモジュールは、アグリゲーターpomではない親のpomを継承します。その親のpomでは、maven-javadoc-pluginを定義します。ただ、検証ステップとして、私は私が今知っている自分のJavadocを生成しますモジュール、(すべてのすべてを構築することができ、これにより

 <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> 

:これは、私がカスタムタグレットを追加する前のように見えたものですaggregate-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> 

:私は、個々のモジュールは、上記の構成に以下を追加することにより構築し、少なくともで、仕事にこれを得ましたこのようになり、各サブプロジェクトの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")でこれを指定する機能が好きでした。

私が必要とするのは、親のpomにすべてのサブプロジェクトについて知ってもらうことなく、タグファイルがクラスファイルにアクセスできる、すべてのサブプロジェクトの全体的なjavadocパッケージです。これどうやってするの?

答えて

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ツールを1回呼び出すだけで、プラグイン全体が機能するため、これを修正するのは簡単ではありません。サブモジュールの設定を尊重したい場合は、それらの設定ブロックをマージする必要があります。これはあなたのケースではtagletArtifactsで動作しますが、指定できるすべての設定では機能しません。どのような形式のフィルタであっても、一般的な方法では実行できません。

関連する問題