JDK8-Maven javadoc 플러그인을 사용하여 javadoc을 생성하려고 할 때 "javax.interceptor.InterceptorBinding에 대한 클래스 파일을 찾을 수 없음"오류 발생


82

JDK8을 사용하고 있습니다 (Jenkins에서 시작한 Linux에서 Win x64 u25 JDK +를 사용하여 Eclipse 작업 공간에서 시도했습니다-jdk-8u20-linux-x64, 둘 다 동일한 문제).

다중 모듈 Maven 프로젝트가 있습니다 (패키징 유형이 "pom"인 기본 모듈에서 Maven 목표 "javadoc : aggregate"를 시작합니다).

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

나는 똑같은 것을 치고 있지만 나는 8u31에있다
RedDeckWins

답변:


137

이것은 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의-API : 1. +를 javax.transaction의 (나 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.2</version>
</dependency>

참고 (2020 년 1 월) : 최신 (그럴듯한) 버전은 현재 1.2.2입니다 ( https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api 참조).


2
예, 이것은 저에게 비슷한 문제를 해결했습니다. JDK 8의 javadoc은 클래스 경로에 전이 종속성이 있어야하지만 JDK 7은 더 관대합니다.
Jesse Glick

11
Maven 종속성은 다음과 같습니다. <dependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor-api </ artifactId> <version> 1.2 </ version> </ dependency>
Tim van der Lippe

고마워요, @kozlovda, 그것을 해결했습니다. 답변을 확인하는 데 오랜 시간이 지연되어 죄송합니다. 그 동안 완전히 다른 작업을하고 있었으며 이전 작업 공간에서이를 확인할 시간을 찾을 수 없었습니다. :-)
Michal Aron 2015

이 많이 :) 도움이 @kozlovda 감사
세르칸하기 Ozdemir을

8
문제는 javadoc 생성 프로세스 중 충돌에만 의존하므로 maven-javadoc-plugin의 추가 종속성으로 추가하는 것이 좋습니다. <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </ groupId> <artifactId> javax.interceptor -api </ artifactId> <version> 1.2 </ version> </ additionalDependency> </ additionalDependencies>
lpratlong

49

@kozlovda가 이미 언급했듯이 문제는 @Transactional주석 ( javax.transaction.Transactional) 과 함께 제공됩니다 .

Spring 애플리케이션 용 Maven 실행에 설명 된 오류가있는 경우 문제를 해결하는 또 다른 방법이 javax.transaction있습니다 org.springframework.transaction.annotation.Transactional. 대신 .

가져 오기를 교체하면 문제가 해결되었습니다.


감사! 내 컨트롤러 클래스 중 하나에 대한 javadoc은 항상 실패했으며 그 이유를 직접 보지 못했습니다. javax.Transactional에 대한 가져 오기가있는 유일한 클래스였습니다.
rdhaese

2
감사합니다. 이것이 올바른 수정입니다. 스프링 애플리케이션을 작성하는 경우 스프링이 javax EJB 트랜잭션을 지원하더라도 스프링 트랜잭션을 사용해야합니다. 그리고 두 개의 다른 Transactional을 섞어서는 안됩니다. 나는 javadoc과 같은 문제가 있었고 수천 중 한 클래스에서 javax.transactional을 가져 왔다는 것을 알았습니다. Javadoc과이 의견은 실제 실수를 찾는 데 도움이되었습니다.
pdenti

이것은 훌륭한 답변이며 대부분의 경우에 적합한 답변이라고 생각합니다. 일반적으로 봄에 @Transactional을 사용하므로 주석을 오해 한 것이 합리적입니다
Phate

12

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>

6
이 답변은 실제로 문제를 해결하는 것이 아니라 오히려 숨 깁니다. failOnError = true를 사용하면 Maven이 빌드를 계속할 수 있지만 JavaDoc이 중단되므로 모든 파일이 생성되지는 않습니다. 예를 들어, 모든 색인 파일이 생성되지 않을 수 있습니다. 잘린 JavaDocs를 사용한 빌드를 성공적인 빌드라고 생각할 수 있습니까?
Martín Straus

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가 버전을 관리하고 필요에 따라 복원하기 때문에 버전이 주석 처리되었습니다.


1
플러그인 구성 내부에 종속성을 추가하면 해당 플러그인에이 종속성이 필요함을 분명히 알 수 있기 때문에 이것이 최선의 대답 IMO입니다.
pyb

5

사용하다

import org.springframework.transaction.annotation.Transactional;

대신에

import javax.transaction.Transactional;

@Transactional을 Spring과 함께 사용할 때


2

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

문제를 해결


-4

POM 파일에 Maven 종속성을 추가 할 수도 있습니다. 그것은 나를 위해이 문제를 해결했습니다.

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.