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

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.+ (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.+. 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


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.


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