JDK8 - Error "class file for javax.interceptor.InterceptorBinding not found" when trying to generate javadoc using Maven javadoc plugin

JavaMavenJava 8Maven Javadoc-Plugin

Java Problem Overview


I am using JDK8 (tried it on my Eclipse workspace with Win x64 u25 JDK + on Linux launched by Jenkins - jdk-8u20-linux-x64, same problem for both).

I have multi-module Maven project (I am launching Maven goal "javadoc:aggregate" from a main module with packaging type "pom").

Pom build section looks like this:

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-javadoc-plugin</artifactId>
			<configuration>
 				<additionalparam>-Xdoclint:none</additionalparam>
			</configuration>
		</plugin>
	</plugins>
</build>

I always receive error:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.10.1:aggregate (default-cli) on project uloan-global-build: An error has occurred in JavaDocs report generation:
[ERROR] Exit code: 1 - javadoc: error - com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for javax.interceptor.InterceptorBinding not found
[ERROR] 
[ERROR] Command line was: /usr/java/jdk1.8.0_20/jre/../bin/javadoc @options @packages

I have tried everything possible and tried to search on Google for a long time, but no success. I have found links, where people had similar problems, but without any information about possible solution:

http://marc.info/?l=maven-user&m=139615350913286&w=2

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (suggesting to update JDK8 to > update 20, which I did, but problem is still the same).

Any hints or anyone experienced this kind of behavior as well (unfortunately it looks as quite "rare" problem for some reason)? Quite desperate about this...

Java Solutions


Solution 1 - Java

This appears to be due to javax.transaction.Transactional (or any other class in your classpath for that matter) being itself annotated with javax.interceptor.InterceptorBinding, which is missing in classpath unless explicitly declared in dependencies:

@Inherited
@InterceptorBinding // <-- this ONE is causing troubles
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Transactional {

Said that:

  • javax.transaction.Transactional - comes with [javax.transaction:javax.transaction-api:1.+][1] (or org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) and is typically used in JPA/ORM/JMS apps to annotate transactional methods.
  • javax.interceptor.InterceptorBinding - should come with [javax.interceptor:javax.interceptor-api:1.+][2]. But, although declared on top of Transactional, is not required for normal operation and (looks like because of this) is not getting fetched as a transitive dependency of your JPA framework.

As a result JDK8 javadoc tool fails to process the sources (if any of them are annotated with @Transactional).

Although it could be more specific about the place where this "error" has been found.

Issue fix: adding javax.interceptor:javax.interceptor-api:1.+ dependency fixes the issue.

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2.2</version>
</dependency>

Note (January 2020): the latest (plausible) version is currently 1.2.2 (see [https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api][3]

[1]: https://repository.sonatype.org/#nexus-search;gav~javax.transaction~javax.transaction-api~1.2~~ "javax.transaction:javax.transaction-api:1.+" [2]: https://repository.sonatype.org/#nexus-search;gav~javax.interceptor~javax.interceptor-api~1.2~~%20javax.interceptor:javax.interceptor-api:1.2%22 [3]: https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api

Solution 2 - Java

As @kozlovda already mentions, the issue comes with the @Transactional annotation (javax.transaction.Transactional).

If you have the described error on a Maven run for a Spring application, there is also another way to resolve the issue: Make sure not to use the the annotation from javax.transaction, instead use org.springframework.transaction.annotation.Transactional.

Replacing the import fixed the issue for me.

Solution 3 - Java

@lpratlong says in an answer supplied in a comment "add it as an additionnal dependencies of maven-javadoc-plugin". That worked for me, here's the full Maven plugin entry for impatient people like me to copy-paste:

		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-javadoc-plugin</artifactId>
			<!-- <version>3.0.0</version> -->
			<configuration>
				<!-- Silence error javax.interceptor.InterceptorBinding not found -->
				<additionalDependencies>
					<additionalDependency>
						<groupId>javax.interceptor</groupId>
						<artifactId>javax.interceptor-api</artifactId>
						<version>1.2</version>
					</additionalDependency>
				</additionalDependencies>
			</configuration>
		</plugin>

The version is commented out because in my case spring-boot manages the version, just restore as needed.

Solution 4 - Java

You can also add the following line to your javadoc maven configuration: <failOnError>false</failOnError>. This will tell the javadoc execution to ignore all errors and not let the build fail.

Your complete javadoc plugin config would therefore look like this:

<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <configuration>
               <source>1.8</source>
               <target>1.8</target>
           </configuration>
       </plugin>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
           <configuration>
               <additionalparam>-Xdoclint:none</additionalparam>
               <failOnError>false</failOnError>
           </configuration>
       </plugin>
    </plugins>
</build>

Solution 5 - Java

Use

import org.springframework.transaction.annotation.Transactional;

instead of

import javax.transaction.Transactional;

when you are using @Transactional with Spring

Solution 6 - Java

InterceptorBinding is available at following maven dependency:

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>

Solution 7 - Java

I had the same problem with Spring-Boot 2 Kotlin and gradle. As @kozlovda suggested:

dependencies {
  compileOnly 'javax.interceptor:javax.interceptor-api:1.+'
  ...

fixed the problem

Solution 8 - Java

Replace as below

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

Solution 9 - Java

This slightly-more-modern dependency can also be used to resolve the issue:

<dependency>
    <groupId>jakarta.interceptor</groupId>
    <artifactId>jakarta.interceptor-api</artifactId>
    <version>1.2.5</version>
</dependency>

Solution 10 - Java

You can also add Maven dependency to your POM file. It solved this problem for me

	<dependency>
	    <groupId>net.sourceforge.cobertura</groupId>
	    <artifactId>cobertura</artifactId>
	    <version>2.1.1</version>
	    <scope>compile</scope>
	</dependency>

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
QuestionMichal AronView Question on Stackoverflow
Solution 1 - JavakozlovdaView Answer on Stackoverflow
Solution 2 - JavaAndreas SiegelView Answer on Stackoverflow
Solution 3 - JavachrisinmtownView Answer on Stackoverflow
Solution 4 - JavadfmeView Answer on Stackoverflow
Solution 5 - JavagfklView Answer on Stackoverflow
Solution 6 - JavaOleksii KyslytsynView Answer on Stackoverflow
Solution 7 - JavaOliver SahnerView Answer on Stackoverflow
Solution 8 - JavaFred OndiekiView Answer on Stackoverflow
Solution 9 - JavaGregory WilliamsView Answer on Stackoverflow
Solution 10 - JavaEv.Rei.View Answer on Stackoverflow