JDK8 - Lỗi “không tìm thấy tệp lớp cho javax.interceptor.InterceptorBinding” khi cố gắng tạo javadoc bằng plugin Maven javadoc


82

Tôi đang sử dụng JDK8 (đã thử nó trên không gian làm việc Eclipse của tôi với Win x64 u25 JDK + trên Linux do Jenkins khởi chạy - jdk-8u20-linux-x64, cùng một vấn đề cho cả hai).

Tôi có dự án Maven đa mô-đun (Tôi đang khởi chạy mục tiêu Maven "javadoc: tổng hợp" từ một mô-đun chính với kiểu đóng gói "pom").

Phần xây dựng Pom trông như thế này:

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

Tôi luôn nhận được lỗi:

[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

Tôi đã thử mọi cách có thể và cố gắng tìm kiếm trên Google trong một thời gian dài, nhưng không thành công. Tôi đã tìm thấy các liên kết, nơi mọi người gặp sự cố tương tự, nhưng không có bất kỳ thông tin nào về giải pháp khả thi:

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 (đề xuất cập nhật JDK8 lên> cập nhật 20, tôi đã thực hiện, nhưng sự cố vẫn còn giống nhau).

Bất kỳ gợi ý hoặc bất kỳ ai đã trải qua loại hành vi này (tiếc là nó có vẻ là vấn đề khá "hiếm" vì một số lý do)? Khá tuyệt vọng về điều này ...


1
Bạn có chắc mình đã cài đặt 8u20 đúng cách không?
JamesB

Tôi đã cùng một vấn đề với GRADLE - đó là vì tôi đã JDK 1.7 trên con đường của tôi, nhưng JAVA_HOME được chỉ vào một JDK 1.8 - Cảm ơn, @JamesB
BretC

Tôi đang gặp phải điều tương tự nhưng tôi đang ở trên 8u31
RedDeckWins

Câu trả lời:


137

Điều này dường như là do javax.transaction.Transactional(hoặc bất kỳ lớp nào khác trong classpath của bạn cho vấn đề đó) được chú thích với chính nó javax.interceptor.InterceptorBinding, cái này bị thiếu trong classpath trừ khi được khai báo rõ ràng trong các phần phụ thuộc:

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

Nói rằng:

  • javax.transaction.Transactional- đi kèm với javax.transaction: javax.transaction-api: 1. + (hoặc org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) và thường được sử dụng trong các ứng dụng JPA / ORM / JMS để chú thích các phương thức giao dịch.
  • javax.interceptor.InterceptorBinding- nên đi kèm với javax.interceptor: javax.interceptor-api: 1. + . Tuy nhiên, mặc dù được khai báo ở trên Transactional, không bắt buộc đối với hoạt động bình thường và (có vẻ như vì điều này) không được tìm nạp như một phụ thuộc bắc cầu của khung JPA của bạn.

Do đó, công cụ javadoc JDK8 không xử lý được các nguồn (nếu bất kỳ nguồn nào trong số chúng được chú thích bằng @Transactional).

Mặc dù có thể cụ thể hơn về nơi đã tìm ra "lỗi" này.

Khắc phục sự cố : thêm phần javax.interceptor:javax.interceptor-api:1.+phụ thuộc sẽ khắc phục sự cố.

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

Lưu ý (tháng 1 năm 2020): phiên bản mới nhất (hợp lý) hiện là 1.2.2 (xem https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api


2
Vâng, điều này đã giải quyết một vấn đề tương tự cho tôi. Có vẻ như javadoc của JDK 8 yêu cầu các phụ thuộc bắc cầu nằm trong classpath trong khi JDK 7 thì khoan dung hơn.
Jesse Glick vào

11
Phần phụ thuộc maven là: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
Tim van der Lippe

Cảm ơn rất nhiều, @kozlovda, đã giải quyết được nó. Xin lỗi vì chậm trễ dài với việc kiểm tra câu trả lời - đã làm việc trên một cái gì đó hoàn toàn khác nhau trong khi chờ đợi và không thể tìm thấy thời gian để xác minh điều này trong không gian làm việc cũ :-)
Michal Aron

Cảm ơn bạn @kozlovda này đã giúp rất nhiều :)
Sercan Ozdemir

8
Tốt hơn nên thêm nó làm phụ thuộc bổ sung của maven-javadoc-plugin vì sự cố chỉ xảy ra xung đột trong quá trình tạo javadoc: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependencies>
lpratlong

49

Như @kozlovda đã đề cập, vấn đề đi kèm với @Transactionalchú thích ( javax.transaction.Transactional).

Nếu bạn gặp lỗi được mô tả trên Maven chạy ứng dụng Spring, cũng có một cách khác để giải quyết vấn đề: Đảm bảo không sử dụng chú thích từ javax.transaction, thay vào đó hãy sử dụng org.springframework.transaction.annotation.Transactional.

Thay thế nhập đã khắc phục sự cố cho tôi.


Cảm ơn! Javadoc cho một trong các lớp bộ điều khiển của tôi luôn bị lỗi và tôi không trực tiếp thấy tại sao. Đây là lớp duy nhất có nhập trên javax.Transactional.
rdhaese 12/07/17

2
cảm ơn, đây là sửa chữa đúng. Nếu bạn đang viết một ứng dụng spring, bạn phải sử dụng giao dịch spring, ngay cả khi spring hỗ trợ giao dịch javax EJB. Và bạn không được phép kết hợp hai Giao dịch khác nhau. Tôi gặp vấn đề tương tự với javadoc và tôi phát hiện ra trong số hàng nghìn lớp tôi đã nhập javax.transactional. Javadoc và nhận xét này đã giúp tôi tìm ra sai lầm thực sự.
pdenti

Đây là một câu trả lời tuyệt vời và tôi nghĩ là câu trả lời phù hợp cho hầu hết các trường hợp. Thông thường, bạn đang sử dụng @Transactional vào mùa xuân và do đó, bạn có thể nhầm chú thích
Phate

12

Bạn cũng có thể thêm dòng sau đây để cấu hình maven javadoc của bạn: <failOnError>false</failOnError>. Điều này sẽ cho phép thực thi javadoc bỏ qua tất cả các lỗi và không để quá trình xây dựng bị lỗi.

Do đó, cấu hình plugin javadoc hoàn chỉnh của bạn sẽ trông giống như sau:

<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
Câu trả lời này không thực sự giải quyết vấn đề, mà nó ẩn nó đi. failOnError = true cho phép Maven tiếp tục xây dựng, nhưng vì JavaDoc hủy bỏ, không phải tất cả các tệp đều được tạo. Ví dụ: tất cả các tệp chỉ mục có thể không được tạo. Bạn có thể coi một bản dựng với JavaDocs bị cắt ngắn là một bản thành công không?
Martín Straus

12

@lpratlong cho biết trong một câu trả lời được cung cấp trong một nhận xét "thêm nó làm phụ thuộc bổ sung của maven-javadoc-plugin". Điều đó phù hợp với tôi, đây là mục nhập plugin Maven đầy đủ cho những người thiếu kiên nhẫn như tôi sao chép-dán:

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

Phiên bản được nhận xét vì trong trường hợp của tôi, spring-boot quản lý phiên bản, chỉ cần khôi phục khi cần thiết.


1
Đây là câu trả lời tốt nhất IMO bởi vì việc thêm phần phụ thuộc vào bên trong cấu hình plugin sẽ làm rõ ràng rằng phần phụ thuộc này là cần thiết của plugin đó.
pyb

5

Sử dụng

import org.springframework.transaction.annotation.Transactional;

thay vì

import javax.transaction.Transactional;

khi bạn đang sử dụng @Transactional với Spring


2

InterceptorBinding có sẵn tại sự phụ thuộc maven sau:

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

1

Thay thế như bên dưới

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

0

Tôi đã gặp vấn đề tương tự với Spring-Boot 2 Kotlin và gradle. Như @kozlovda đã đề xuất:

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

đã khắc phục sự cố


-4

Bạn cũng có thể thêm phần phụ thuộc Maven vào tệp POM của mình. Nó đã giải quyết vấn đề này cho tôi

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.