Aggregating Javadocs For Multi-Projects

For example, consider the following directory structure:

Project
  |-- pom.xml
  |-- Module1
  |   `-- pom.xml
  |   `-- Module 2
  |       `-- pom.xml
  |   `-- Module 3
  |       `-- pom.xml
  |-- Module4
  |   `-- pom.xml
  `-- Module5
    `-- pom.xml

Since 3.1.0 the aggregate has changed a little bit. It'll generate aggregated reports at every level. To get only an aggregated project at root level, you need to configure the pom like:

<project>
  ...
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.6.3</version>
        <reportSets>
          <reportSet>
            <id>aggregate</id>
            <inherited>false</inherited>
            <reports>
              <report>aggregate</report>
            </reports>
          </reportSet>
          <reportSet>
            <id>default</id>
            <reports>
              <report>javadoc</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
    </plugins>
    ...
  </reporting>
  ...
</project>

Using The aggregate Goals

The <aggregate/> parameter doesn't include generate source directories defined using the build-helper:add-source. In this case, you need to use the aggregate goal and test-aggregate goals. You could define these goals in the <build/> element (using the <execution/> tag) or <reporting/> element (using the <reportSet/> tag) as shown below. For more information, refer to the Selective Javadocs Reports page.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.6.3</version>
        <configuration>
          <!-- Default configuration for all reports -->
          ...
        </configuration>
        <executions>
          <execution>
            <id>aggregate</id>
            <goals>
              <goal>aggregate</goal>
            </goals>
            <phase>site</phase>
            <configuration>
              <!-- Specific configuration for the aggregate report -->
              ...
            </configuration>
          </execution>
          ...
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>
<project>
  ...
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.6.3</version>
        <configuration>
          <!-- Default configuration for all reports -->
          ...
        </configuration>
        <reportSets>
          <reportSet>
            <id>non-aggregate</id>
            <configuration>
              <!-- Specific configuration for the non aggregate report -->
              ...
            </configuration>
            <reports>
              <report>javadoc</report>
            </reports>
          </reportSet>
          <reportSet>
            <id>aggregate</id>
            <configuration>
              <!-- Specific configuration for the aggregate report -->
              ...
            </configuration>
            <reports>
              <report>aggregate</report>
            </reports>
          </reportSet>
          ...
        </reportSets>
      </plugin>
      ...
    </plugins>
  </reporting>
  ...
</project>

Aggregating Javadocs For Modularized projects

Since Java 9 it is possible to add module descriptors to your projects, which can have an impact on the generated reports. Be aware that is not possible to have a mixture of named and unnamed modules. Ideally every Maven module has a Java module descriptor, but this is not always possible, e.g. due to split packages of dependencies. In such case you must have a jar containing a META-INF/MANIFEST.MF with an entry for the Automatic-Module-Name. In other words: ensure to call package javadoc:aggregate, because the manifest file is only being read from jar, not from directory.

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <archive>
              <manifestEntries>
                <Automatic-Module-Name>com.foo.bar</Automatic-Module-Name>
              </manifestEntries>
            </archive>
          </configuration>
        </plugin>

Occasionally, automatic modules need to import named modules. For example,

        error: package org.w3c.dom is not visible
        (package org.w3c.dom is declared in module java.xml, but module foobar does not read it)

can be solved by adding the relevant --add-modules options to the plugin configuration:

        <additionalOptions>
          <option>--add-modules</option>
          <option>java.xml</option>
        </additionalOptions>

The Javadoc plugin contains several aggregate goals to be use with an aggregator project. Here is the full list of all aggregate goals: