Подтвердить что ты не робот

JDK8 - Ошибка "для файла javax.interceptor.InterceptorBinding не найден" при попытке создания javadoc с использованием плагина Maven javadoc

Я использую JDK8 (попробовал это на рабочем пространстве Eclipse с помощью Win x64 u25 JDK + в Linux, запущенном Jenkins - jdk-8u20-linux-x64, такая же проблема для обоих).

У меня есть мультимодульный проект Maven (я запускаю цель Maven "javadoc: aggregate" из основного модуля с типом упаковки "pom" ).

Раздел сборки Pom выглядит следующим образом:

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

Я всегда получаю ошибку:

[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

Я пробовал все возможное и пытался долгое время искать в Google, но не добился успеха. Я нашел ссылки, где у людей были подобные проблемы, но без какой-либо информации о возможном решении:

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

http://mail-archives.apache.org/mod_mbox/maven-users/201409.mbox/%[email protected]%3E (предлагая обновить JDK8 до > обновить 20, что я и сделал, но проблема все та же).

Любые намеки или кто-либо испытал подобное поведение (к сожалению, по какой-то причине это выглядит как "редкая" проблема)? Очень отчаянный об этом...

4b9b3361

Ответ 1

По-видимому, это связано с тем, что javax.transaction.Transactional (или любой другой класс в вашем пути к классам) сам помечен javax.interceptor.InterceptorBinding, который отсутствует в пути к классам, если он явно не объявлен в зависимостях:

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

сказал, что:

  • javax.transaction.Transactional - поставляется с javax.transaction: javax.transaction-api: 1. + (или org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) и обычно используется в приложениях JPA/ORM/JMS для аннотирования транзакционных методов.
  • javax.interceptor.InterceptorBinding - должен поставляться с javax.interceptor: javax.interceptor-api: 1. +. Но, хотя он объявлен поверх Transactional, он не требуется для нормальной работы и (похоже из-за этого) не извлекается как транзитивная зависимость вашей среды JPA.

В результате инструмент JDK8 Javadoc не может обработать источники (если какой-либо из них помечен @Transactional).

Хотя это может быть более конкретно о месте, где была обнаружена эта "ошибка".

Исправление проблемы: добавление зависимости javax.interceptor:javax.interceptor-api:1.+ устраняет проблему.

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

Ответ 2

Как уже упоминает @kozlovda, проблема связана с аннотацией @Transactional (javax.transaction.Transactional).

Если у вас есть описанная ошибка при запуске Maven для приложения Spring, есть еще один способ решить проблему: Не используйте аннотацию из javax.transaction, вместо этого используйте org.springframework.transaction.annotation.Transactional.

Замена импорта устранила проблему для меня.

Ответ 3

Вы также можете добавить следующую строку в конфигурацию javadoc maven: <failOnError>false</failOnError>. Это скажет, что выполнение javadoc игнорирует все ошибки и не позволяет сбою сборки.

Ваша полная конфигурация плагина javadoc будет выглядеть следующим образом:

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

Ответ 4

@lpratlong говорит в ответе, представленном в комментарии: "добавьте его как дополнительные зависимости maven-javadoc-plugin". Это сработало для меня, вот полная запись плагина Maven для нетерпеливых людей, таких как я, для копирования-вставки:

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

Версия закомментирована, потому что в моем случае spring-boot управляет версией, просто восстановите по мере необходимости.

Ответ 5

InterceptorBinding доступен при следующих зависимостях maven:

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

Ответ 6

У меня была такая же проблема с Spring-Boot 2 Kotlin и gradle. Как сказал @kozlovda:

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

исправил проблему

Ответ 7

Заменить, как показано ниже

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

Ответ 8

Вы также можете добавить зависимость Maven к вашему POM файлу. Он решил эту проблему для меня

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