Java >> Java tutorial >  >> Tag >> import

Eclipse er forvirret af import (tilgængelig fra mere end ét modul)

Dette er forårsaget af

  • en JAR på Klassestien der indeholder pakken java.awt der også findes i systembiblioteket men den
  • JRE-systembibliotek er modulstien

I Java Platform Module System (JPMS) er det ikke tilladt at bruge den samme pakke i mere end ét modul. Hvis modulstien og Klassestien bruges, alt på Klassestien håndteres som <unnamed> modul (i dit tilfælde pakken java.awt findes i systemmodulet java.desktop og også via JAR på Klassestien i modulet <unnamed> ).

Siden JRE System Library kan ikke flyttes fra modulstien til Klassestien (se dette svar af Stephan Herrmann for detaljer), du har kun følgende muligheder:

  • Indstil overholdelse af compiler til 1.8 (som du allerede har nævnt)
  • Genopbygget JAR for at undgå Java-systembibliotekets pakkenavne inde i JAR (hvis der bruges refleksion, kan yderligere kodeændringer være nødvendige):
    • Hvis du har kildekoden, skal du ændre pakkenavnene (f.eks. skift pakken og underpakken java til java_util og javax til javax_util ) og genskab JAR
    • Hvis du kun har .class filer skal du dekompilere .class filer først

Da jeg vil vædde på, at mange mennesker vil løbe ind i dette problem med modulær Java, vil jeg hjælpe og give det rigtige svar. Denne fejl opstår, når du har en afhængighed i dit projekt, der indeholder kode ved hjælp af pakker, der også er i de moduler, som dit projekt refererer til. Hvis dit projekt har sat kildekompatibiliteten til noget som Java 12, vil det begynde at håndhæve reglen, som har været der hele tiden i Java. "Brug ikke pakker, der hører til JDK i din egen kode." Desværre har mange udviklere og leverandører gjort det gennem årene. Kan ikke gøre det mere. Hvis du indstiller dit projekt til Java 12-kildekompatibilitet, tilføjer Eclipse JDK-modulerne, som inkluderer alt "java." og "javax. " og endda "jdk.", "org.w3c. ". Disse pakker kan være i brug af dine afhængigheder eller deres transitive afhængigheder.

Sådan løser du det:Du skal se på, hvilken pakke det klager over, og udvide noden "Projekter og eksterne afhængigheder" i Pakke Explorer. Find ud af, hvilken afhængighed der bruger den pakke. Så kan du blot udelukke den afhængighed fra dit projekt. Eller du kan få kilden til den afhængighed, hvis den er tilgængelig, og genopbygge krukken med ændrede pakker. Ellers skal du fjerne den afhængighed og finde en erstatning for den teknologi. Smerter ikke?

Hvis det er en transitiv afhængighed, kan du ofte bare udelukke det. Her er et eksempel på det for Gradle-baserede projekter.

configurations {
    all*.exclude group: 'xml-apis'
}

I mit tilfælde var det fordi jeg inkluderede en afhængighed (Apache Tika) i POM.xml-filen.

Jeg var nødt til at tvinge udelukkelsen af ​​modulet, der indeholdt klasserne med fejl, mens det blev importeret med denne afhængighed:

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.24.1</version>
        <exclusions>
            <exclusion>
                <groupId>xml-apis</groupId>
                <artifactId>xml-apis</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Det virkede for mig på den måde.


Java tag