2017-07-19 3 views
1

Ich habe ein größeres Multimodul Maven Build. Ich muss das Javadoc für alle Module generieren und ein "aggregiertes" Javadoc-Ergebnis erzeugen, das ich zu einer Box für den Verbrauch durch Benutzer bereitstellen kann.Wie Maven Subprojekt Javadoc-Ausgabe ohne Regenerierung Javadoc aggregieren

Ich hatte das funktioniert ganz gut für eine ganze Weile, bis ich versuchte, ein benutzerdefiniertes Taglet mit bestimmten Funktionen und Anforderungen zu implementieren, die es komplizierter zu produzieren macht.

Alle Submodule erben ein Elternpom, das nicht das Aggregatorpom ist. In diesem Elternteil definiere ich das maven-javadoc-plugin. Dies ist, wie es aussah, bevor ich die benutzerdefinierte taglet hinzugefügt:

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

Damit ich alle alle Module bauen könnte, die ihre eigenen javadoc erzeugen (was ich jetzt weiß, ist nur ein Validierungsschritt, wie aggregate-jar verwendet diese Ausgabe nicht. Ich habe einen separaten Schritt, den ich von jenkins anrufe, der "javadoc: aggregate-jar" im Stammprojekt ausführt, das das aggregierte Javadoc-Jar erzeugt, das ich bereitstelle.

Auch dies funktioniert bis jetzt einwandfrei.

Ich habe ein benutzerdefiniertes Javadoc-Taglet implementiert, das Zugriff auf das Klassenobjekt benötigt, das der Quelldatei zugeordnet ist, in der es enthalten ist. Ich habe dies funktioniert, zumindest in dem einzelnen Modul baut die folgenden, indem zu der Konfiguration oben: den

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

Um zu haben taglet Zugriff auf die Klassendatei, ich hatte eine minimale Plugin-Konfiguration hinzufügen zu jedem Teilprojekt pom.xml, die wie folgt aussieht:

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

Mit diesen minimalen Veränderungen, konnte ich den Build in jedem Modul, die Erzeugung des javadoc und Prüfung der erzeugten javadoc Ausgang in jedem Modul, Verifizieren, dass es laufen Alles hat funktioniert.

Das Problem ist jedoch, wenn ich "javadoc: aggregate-jar" im Stammprojekt ausführen, wird die gesamte bereits erstellte Ausgabe ignoriert. Es führt die Javadoc-Generierung für alle Unterprojekte erneut aus und ignoriert dabei die angehängte TagletArtifacts-Liste in jeder Unterprojektdatei pom.xml. Daher erhalte ich ClassNotFound Fehler, wenn es versucht, die Klassendatei zu erhalten.

Ich könnte "beheben", indem Sie alle Teilprojekt GAVs in die oberste Ebene "tagletArtifacts" -Liste setzen, aber das möchte ich definitiv nicht tun. Ich mochte die Möglichkeit, dies im Unterprojekt pom.xml (mit combine.children = "append") anzugeben, damit es funktioniert.

Was ich brauche, ist ein gesamtes Javadoc-Paket für alle Unterprojekte, mit dem Taglet Zugriff auf die Klassendatei erhalten, ohne das Eltern-Pom zu zwingen, über alle seine Teilprojekte zu wissen. Wie kann ich das machen?

Antwort

0

Ich habe das gleiche Problem mit allen aggregierten Zielen. Ich überprüfte den Quellcode auf maven-javadoc-plugin und es stellt sich heraus, dass aggregierte Arbeit durch Durchlaufen von Submodulen und das Sammeln von Quelldateien und nichts mehr, und damit vollständig ignoriert alle Formularkonfigurationen in den Submodulen angegeben.

Während der Ausführung wird jedes Modul vollständig ignoriert: source

if (isAggregator() && !project.isExecutionRoot()) { 
    return; 
} 

Und während des Sammelns von Quelldateien Submodule durchlaufen: source

if (isAggregator() && project.isExecutionRoot()) { 
    for (MavenProject subProject : reactorProjects) { 
     if (subProject != project) { 
      List<String> sourceRoots = getProjectSourceRoots(subProject); 

Also im Moment gibt es keine Möglichkeit gibt, zu tun Dies.

Dies ist auch nicht einfach zu beheben, da das ganze Plugin funktioniert, indem man einen einzigen Aufruf zum eigentlichen javadoc-Tool verfasst. Wenn Sie auch die Einstellungen in den Submodulen berücksichtigen möchten, müssen Sie die Konfigurationsblöcke zusammenführen. Während dies in Ihrem Fall mit tagletArtifacts funktioniert, funktioniert es nicht für alle Einstellungen, die Sie angeben können, z. jede Form von Filter, und kann daher nicht in einer allgemeinen Art und Weise getan werden.

Verwandte Themen