JDK8 - Maven javadoc eklentisini kullanarak javadoc oluşturmaya çalışırken "javax.interceptor.InterceptorBinding için sınıf dosyası bulunamadı" hatası


85

JDK8 kullanıyorum (Eclipse çalışma alanımda Jenkins tarafından başlatılan Linux'ta Win x64 u25 JDK + ile denedim - jdk-8u20-linux-x64, her ikisi için de aynı sorun).

Çok modüllü Maven projem var ("pom" ambalaj türüne sahip bir ana modülden "javadoc: aggregate" Maven hedefini başlatıyorum).

Pom yapı bölümü şuna benzer:

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

Her zaman hata alıyorum:

[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

Mümkün olan her şeyi denedim ve uzun süre Google'da arama yapmaya çalıştım, ancak başarılı olamadım. İnsanların benzer sorunlara sahip olduğu, ancak olası çözüm hakkında herhangi bir bilgi olmadan bağlantılar buldum:

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'i> güncelleme 20'ye güncellemeyi öneriyor, ama sorun hala devam ediyor aynısı).

Herhangi bir ipucu veya bu tür bir davranış yaşayan biri de (ne yazık ki bazı nedenlerden dolayı oldukça "nadir" bir sorun gibi görünüyor)? Bu konuda oldukça umutsuz ...


1
8u20'yi doğru kurduğunuzdan emin misiniz?
JamesB

Benim yolunda JDK 1.7 vardı çünkü ama java_home bir 1.8 JDK işaret ediyordu - - Ben GRADLE ile aynı problem vardı teşekkürler, @JamesB
BretC

Aynı şeyi vuruyorum ama 8u31'deyim
RedDeckWins

Yanıtlar:


140

Bunun nedeni , bağımlılıklarda açıkça belirtilmediği sürece sınıf yolunda eksik olan javax.transaction.Transactional(veya bu konu için sınıf yolunuzdaki başka bir sınıfın) kendisiyle ek açıklamalı olmasından kaynaklanıyor gibi görünüyor javax.interceptor.InterceptorBinding:

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

Dedi ki:

  • javax.transaction.Transactional- javax.transaction ile birlikte gelir: javax.transaction-api: 1. + (veya org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final) ve genellikle işlem yöntemlerine açıklama eklemek için JPA / ORM / JMS uygulamalarında kullanılır.
  • javax.interceptor.InterceptorBinding- javax.interceptor: javax.interceptor-api: 1. + ile gelmelidir . Ancak, en üstte bildirilmesine rağmen Transactional, normal işlem için gerekli değildir ve (bu nedenle görünür) JPA çerçevenizin geçişli bağımlılığı olarak algılanmaz.

Sonuç olarak, JDK8 javadoc aracı kaynakları işleyemez (bunlardan herhangi biri ile açıklanmışsa @Transactional).

Yine de bu "hatanın" bulunduğu yer hakkında daha spesifik olabilir.

Sorun düzeltmesi : javax.interceptor:javax.interceptor-api:1.+bağımlılık eklemek sorunu düzeltir.

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

Not (Ocak 2020): En son (makul) sürüm şu anda 1.2.2'dir (bkz. Https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api


2
Evet, bu benim için benzer bir sorunu çözdü. Görünüşe göre JDK 8'in javadoc'u geçişli bağımlılıkların sınıf yolunda olmasını gerektiriyor, oysa JDK 7 daha yumuşaktı.
Jesse Glick

11
Maven bağımlılığı şudur: <dependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor-api </artifactId> <version> 1.2 </version> </dependency>
Tim van der Lippe

Çok teşekkürler @kozlovda, bu sorunu çözdü. Cevabı kontrol etmekte geciktiğim için özür dilerim - bu arada tamamen farklı bir şey üzerinde çalışıyordu ve bunu eski çalışma alanında doğrulamak için zaman bulamadım :-)
Michal Aron

Teşekkürler @kozlovda bu çok yardımcı oldu :)
Sercan Özdemir

8
Sorun yalnızca javadoc oluşturma işlemi sırasında bir çakışmaya bağlı olduğundan, bunu maven-javadoc-eklentisinin ek bağımlılıkları olarak eklemek daha iyidir: <additionalDependencies> <additionalDependency> <groupId> javax.interceptor </groupId> <artifactId> javax.interceptor -api </artifactId> <version> 1.2 </version> </additionalDependency> </additionalDependency>
lpratlong

51

@Kozlovda'nın zaten bahsettiği gibi, konu @Transactionalek açıklama ( javax.transaction.Transactional) ile birlikte geliyor .

Bir Spring uygulaması için bir Maven çalıştırmasında açıklanan hatayı yaşıyorsanız, sorunu çözmenin başka bir yolu da vardır: javax.transactionBunun yerine , 'daki açıklamayı kullanmadığınızdan emin olun org.springframework.transaction.annotation.Transactional.

İçe aktarımı değiştirmek sorunu benim için çözdü.


Teşekkürler! Denetleyici sınıflarımdan biri için javadoc her zaman başarısız oldu ve nedenini doğrudan anlamadım. Javax.Transactional üzerinde içe aktarımı olan tek sınıftı.
rdhaese

2
teşekkürler, bu doğru çözüm. Bir yay uygulaması yazıyorsanız, yay javax EJB işlemini desteklese bile, yay işlemsel kullanmanız gerekir. Ve iki farklı İşlemi karıştırmamanız gerekiyor. Javadoc ile aynı sorunu yaşadım ve binlerce sınıftan birinde javax.transactional'in içe aktarıldığını öğrendim. Javadoc ve bu yorum gerçek hatayı bulmamda bana yardımcı oldu.
pdenti

Bu harika bir cevap ve sanırım çoğu durum için doğru cevap. Genellikle @Transactional'ı baharda kullanıyorsunuz ve bu nedenle ek açıklamayı yanlış
anlamış

12

Ayrıca javadoc maven yapılandırması aşağıdaki satırı ekleyebilirsiniz: <failOnError>false</failOnError>. Bu, javadoc yürütmesine tüm hataları yok saymasını ve derlemenin başarısız olmasına izin vermemesini söyleyecektir.

Tam javadoc eklenti yapılandırmanız bu nedenle şöyle görünecektir:

<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
Bu cevap aslında soruna değinmez, daha çok onu gizler. failOnError = true, Maven'in oluşturmaya devam etmesine izin verir, ancak JavaDoc iptal edildiği için tüm dosyalar oluşturulmaz. Örneğin, tüm dizin dosyaları oluşturulamayabilir. Kesilmiş JavaDocs ile bir yapının başarılı olduğunu düşünebilir misiniz?
Martín Straus

12

@lpratlong, bir yorumda verilen bir cevapta "bunu maven-javadoc-eklentisinin ek bağımlılıkları olarak ekle" diyor. Bu benim için çalıştı, işte benim gibi sabırsız insanlar için kopyalayıp yapıştırmak için eksiksiz Maven eklentisi girişi:

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

Sürüm yorumlandı çünkü benim durumumda spring-boot sürümü yönetiyor, sadece gerektiği gibi geri yükle.


1
Bu en iyi cevap IMO'dur çünkü eklenti yapılandırmasının içine bağımlılık eklemek, bu bağımlılığın o eklenti tarafından gerekli olduğunu açıkça ortaya koyar.
pyb

5

Kullanım

import org.springframework.transaction.annotation.Transactional;

onun yerine

import javax.transaction.Transactional;

@Transactional'ı Spring ile kullanırken


3

InterceptorBinding, aşağıdaki maven bağımlılığında kullanılabilir:

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

1

Aşağıdaki gibi değiştirin

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class WorkingService

0

Spring-Boot 2 Kotlin ve gradle ile aynı problemi yaşadım. @Kozlovda'nın önerdiği gibi:

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

sorunu çözdü


-5

Ayrıca POM dosyanıza Maven bağımlılığı da ekleyebilirsiniz. Bu sorunu benim için çözdü

    <dependency>
        <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>2.1.1</version>
        <scope>compile</scope>
    </dependency>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.