How to work around the stricter Java 8 Javadoc when using Maven

JavaMavenJava 8

Java Problem Overview


You'll quickly realize that JDK8 is a lot more strict (by default) when it comes to Javadoc. (link - see last bullet point)

If you never generate any Javadoc then of course you'll not experience any problems but things like Maven release process and possibly your CI builds will suddenly fail where they worked just fine with JDK7. Anything that checks the exit value of the Javadoc tool will now fail. JDK8 Javadoc is probably also more verbose in terms of warnings compared to JDK7 but that's not the scope here. We are talking about errors!

This question exist to collect proposals on what to do about it. What is the best approach ? Should these errors be fixed once and for all in the source code files? If you have a huge code base this might be a lot of work. What other options exist ?

You are also welcome to comment with stories of what now fails that would previously pass.

Horror stories of what now fails

wsimport tools

wsimport tool is a code generator for creating web service consumers. It is included in the JDK. Even if you use the wsimport tool from JDK8 it will nevertheless produce source code that cannot be compiled with the javadoc compiler from JDK8.

@author tag

I'm opening up source code files 3-4 years old and see this:

/**
 * My very best class
 * @author John <john.doe@mine.com> 
 */

This now fails because of the < character. Strictly speaking this is justified, but not very forgiving.

HTML tables

HTML Tables in your Javadoc? Consider this valid HTML:

/**
 *
 * <table>
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

This now fails with error message no summary or caption for table. One quick fix is to do like this:

/**
 *
 * <table summary="">
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */

but why this has to be a stop-the-world error from Javadoc tool beats me??

Things that now fail for more obvious reasons

  1. Invalid links, e.g. {@link notexist}
  2. Malformed HTML, e.g. always returns <code>true<code> if ...

UPDATE

Links:

Excellent blog on the subject by Stephen Colebourne.

Java Solutions


Solution 1 - Java

For now, the easiest way I know to work around the stricter Java 8 Javadoc when using Maven is deactivating it.

Since the parameter -Xdoclint:none only exists in Java 8, defining this parameter breaks the build for any other Java. To prevent this, we can create a profile that will be active only for Java 8, making sure our solution works regardless of the Java version.

<profiles>
    <profile>
        <id>disable-java8-doclint</id>
        <activation>
            <jdk>[1.8,)</jdk>
        </activation>
        <properties>
            <additionalparam>-Xdoclint:none</additionalparam>
        </properties>
    </profile>
</profiles>

Just add that to your POM and you're good to go.


For maven-javadoc-plugin 3.0.0 users:

Replace

<additionalparam>-Xdoclint:none</additionalparam>

by

<doclint>none</doclint>

Thanks @banterCZ!

Solution 2 - Java

If you are using the maven javadoc plugin, you can use the failOnError option to prevent it from stopping if it finds any html errors:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <configuration>
    <failOnError>false</failOnError>
  </configuration>
</plugin>

Or you can deactivate the strict html options completely with:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
      <additionalparam>-Xdoclint:none</additionalparam>
    </configuration>
  </plugin>
</plugins>

For more info.

Solution 3 - Java

Since version 3.0.0 of maven-javadoc-plugin the doclint is configured via the dedicated XML tag

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
       <doclint>none</doclint>
    </configuration>
</plugin>

Solution 4 - Java

Note that for the error no summary or caption for table, using <table summary=""> won't work anymore. If that's your situation, add a <caption> element to your table, like this:

<table>
    <caption>Examples</caption>
    ...
</table>

Hope this helps someone out there. It took me a while until I found this out.

Solution 5 - Java

I like @ThiagoPorciúncula's solution but it didn't quite go far enough for me.

I typically already have javadoc plugin additionalparam set which were not being overridden by the profile. Because of this I had to:

  • Set a disableDoclint property to be empty by default.
  • If in java >= 8, set the disableDoclint property to be -Xdoclint:none
  • The use ${disableDoclint} in the additionalparamsection of themaven-javadoc-plugin`.

This seems to work well albeit verbose.

<properties>
    <!-- set empty property -->
    <disableDoclint></disableDoclint>
</properties>
<profiles>
	<profile>
		<id>disable-java8-doclint</id>
		<activation>
			<jdk>[1.8,)</jdk>
		</activation>
		<properties>
		    <!-- set property if >= java 8 -->
			<disableDoclint>-Xdoclint:none</disableDoclint>
		</properties>
	</profile>
	...
</profiles>

Then down below I could use the optional ${disableDoclint} variable in the additionalparam section that I had already defined.

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-javadoc-plugin</artifactId>
	<executions>
		<execution>
			<goals>
				<goal>jar</goal>
			</goals>
			<configuration>
				<showPackage>false</showPackage>
				<additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
			</configuration>
		</execution>
	</executions>
	<configuration>
		<showPackage>false</showPackage>
		<bottom>This documentation content is licensed...</bottom>
		<additionalparam>-tag inheritDoc:X ${disableDoclint}</additionalparam>
	</configuration>
</plugin>

This works under java 8 but doesn't cause syntax errors under java 7. Woo hoo!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpeterhView Question on Stackoverflow
Solution 1 - JavaFred PorciúnculaView Answer on Stackoverflow
Solution 2 - JavaassyliasView Answer on Stackoverflow
Solution 3 - JavaVlad IsajkinView Answer on Stackoverflow
Solution 4 - JavaJeronimo BackesView Answer on Stackoverflow
Solution 5 - JavaGrayView Answer on Stackoverflow