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

85

Я использую 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/%3C54101E24.6060304@gmx.de%3E (предлагается обновить JDK8 до> обновления 20, что я и сделал, но проблема все еще тот же самый).

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

Михал Арон
источник
1
Вы уверены, что правильно установили 8u20?
JamesB
У меня была такая же проблема с GRADLE - это было потому, что у меня на моем пути был JDK 1.7, но JAVA_HOME указывал на 1.8 JDK - Спасибо, @JamesB
BretC 02
У меня то же самое, но я на 8u31
RedDeckWins

Ответы:

140

Это, по-видимому, связано с 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.

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

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

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

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

Примечание (январь 2020 г.): последняя (вероятная) версия в настоящее время - 1.2.2 (см. Https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api

Козловда
источник
2
Да, это решило для меня аналогичную проблему. Кажется, javadoc JDK 8 требует, чтобы транзитивные зависимости были в пути к классам, тогда как JDK 7 был более снисходительным.
Джесси Глик,
11
Зависимость maven: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
Тим ван дер Липпе,
Большое спасибо, @kozlovda, что решила. Извините за долгую задержку с проверкой ответа - тем временем работал над чем-то совершенно другим и не мог найти времени, чтобы проверить это в старом рабочем пространстве :-)
Михал Арон
Спасибо @kozlovda, это очень помогло :)
Серкан Оздемир
8
Лучше добавить его как дополнительные зависимости maven-javadoc-plugin, поскольку проблема связана только с конфликтом во время процесса генерации javadoc: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependencies>
lpratlong
51

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

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

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

Андреас Сигель
источник
Благодаря! Javadoc для одного из моих классов контроллеров всегда терпел неудачу, и я не понимал, почему. Это был единственный класс с импортом в javax.Transactional.
rdhaese
2
спасибо, это правильное решение. Если вы пишете приложение Spring, вы должны использовать транзакционный Spring, даже если Spring поддерживает транзакционный javax EJB. И вы не должны смешивать два разных транзакционных. У меня была такая же проблема с javadoc, и я обнаружил, что в одном классе из тысяч я импортировал javax.transactional. Javadoc и этот комментарий помогли мне найти настоящую ошибку.
pdenti
Это отличный ответ и, я думаю, правильный для большинства случаев. Обычно весной вы используете @Transactional, поэтому логично, что вы ошиблись с аннотацией
Phate
12

Можно также добавить следующую строку в файл конфигурации Maven JavaDoc: <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>
dfme
источник
6
Этот ответ на самом деле не решает проблему, а скорее скрывает ее. failOnError = true позволяет Maven продолжить сборку, но поскольку JavaDoc прерывается, не все файлы создаются. Например, могут быть созданы не все индексные файлы. Можете ли вы считать успешной сборку с усеченными JavaDocs?
Мартин Страус
12

@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 управляет версией, просто восстанавливайте по мере необходимости.

Chrisinmtown
источник
1
Это лучший ответ IMO, потому что добавление зависимости внутри конфигурации плагина дает понять, что эта зависимость необходима этому плагину.
pyb 01
5

Использовать

import org.springframework.transaction.annotation.Transactional;

вместо

import javax.transaction.Transactional;

когда вы используете @Transactional с Spring

gfkl
источник
3

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

<dependency>
    <groupId>javax.interceptor</groupId>
    <artifactId>javax.interceptor-api</artifactId>
    <version>1.2</version>
</dependency>
Алексей Кислицын
источник
1

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

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService
Фред Ондиэки
источник
0

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

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

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

Оливер Санер
источник
-5

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

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
Ev.Rei.
источник