Ho scaricato alcuni software open source scritti in Java e ho provato a compilarlo usando Eclipse. Ho ricevuto l'errore: " La gerarchia del tipo" Nome classe "è incoerente " in alcuni file. Cosa causa questi errori e come posso ripararli?
Ho scaricato alcuni software open source scritti in Java e ho provato a compilarlo usando Eclipse. Ho ricevuto l'errore: " La gerarchia del tipo" Nome classe "è incoerente " in alcuni file. Cosa causa questi errori e come posso ripararli?
Risposte:
Significa che stai tentando di implementare un'interfaccia inesistente o stai estendendo una classe inesistente.
Prova ad aggiornare Eclipse.
Se non funziona, potrebbe significare che hai un riferimento a un JAR che non si trova nel percorso di compilazione. Controlla il percorso di classe del tuo progetto e verifica che sia presente il jar contenente l'interfaccia o la classe.
A volte succede quando aggiungi un barattolo di cui hai bisogno, ma non includi i barattoli di cui ha bisogno. Nel mio caso l'aggiunta di tutti i vasetti in tomcat / lib mi ha aiutato a risolvere questo problema. Sto lavorando a un'app Web.
Controlla i tuoi errori (scheda "marcatori"). Ho avuto anche il seguente errore:
L'archivio per la libreria richiesta nel progetto non può essere letto ...
e quando è stato corretto l'errore "incoerente" è scomparso.
In realtà avevo aggiunto dei vasetti al percorso di compilazione, ma per qualche motivo non potevano essere letti con errori
L'archivio per la libreria richiesta nel progetto non può essere letto o non è un file ZIP valido
Quindi invece li ho aggiunti come "vasetti esterni". Ciò ha aiutato e tutti i problemi di compilazione non c'erano più!
Un altro caso che ho avuto. Fornisci il percorso del progetto corretto e importalo in Eclipse.
Quindi vai su Progetto -> Pulisci -> Pulisci tutti i progetti.
È necessario pulire il progetto o riavviare Eclipse.
Vedrai questo errore nel caso in cui una classe nel tuo file di libreria che hai nel percorso di classe abbia riferimento a classi inesistenti che potrebbero trovarsi in un altro file jar. Qui, ho ricevuto questo errore quando non l'ho aggiunto org.springframework.beans-3.1.2.RELEASE.jare ho esteso una classe da org.springframework.jdbc.core.support.JdbcDaoSupport, che era nel org.springframework.jdbc-3.1.2.RELEASE.jarmio percorso di classe.
Il problema potrebbe essere che hai inserito barattoli errati. Ho avuto lo stesso problema e il motivo era che avevo incluso la libreria JRE predefinita errata nel percorso di compilazione del progetto. Avevo installato Java con un'altra versione e includevo i file JRE di Java con una versione diversa. (Avevo installato JRE 1.6 nel mio sistema e avevo la libreria JRE 1.7 inclusa nel percorso di compilazione a causa di Java precedentemente installato) Potrebbe essere possibile verificare se la libreria JRE che è stata inclusa nel percorso di compilazione è della versione corretta, ad es. della versione Java installata nel sistema.
Ho riscontrato questo problema su Eclipse Juno, la causa principale era che sebbene alcuni barattoli a molla fossero inclusi da dipendenze transitorie del forno, erano inclusi in versioni errate.
Quindi dovresti controllare se usi un framework modulare come spring che tutti i moduli (o almeno i più importanti: core, bean, context, aop, tx, ecc.) Siano nella stessa versione.
Per risolvere il problema ho usato esclusioni di dipendenza maven per evitare la versione errata delle dipendenze transitorie.
Errore: la gerarchia del tipo "nome classe" è un errore incoerente.
soluzione: class OtherDepJar {} -> è all'interno di "other.dep.jar" .
la classe DepJar estende OtherDepJar {} -> è all'interno di "dep.jar" .
class ProblematicClass estende DepJar {} -> è all'interno del progetto corrente.
Se dep.jar si trova nel percorso di classe del progetto, ma other.dep.jar non è nel percorso di classe del progetto, Eclipse mostrerà "La gerarchia del tipo ... è un errore incoerente"
Per me, il problema era dovuto a importazioni errate. In effetti, è necessario aggiornare le importazioni dopo aver aggiunto la libreria di supporto v7.
Può essere risolto nel modo seguente, per ogni classe del tuo progetto :
import android.[*] , in ogni classeandroid.support.[*](e non android.[*]).È stato sicuramente perché mancavano dipendenze che non erano nel mio pom.xml di maven.
Ad esempio, volevo creare test di integrazione per la mia implementazione del sito dimostrativo di e-commerce a foglia larga.
Avevo incluso un vaso a foglia larga con test di integrazione del commercio a foglia larga al fine di riutilizzare i file di configurazione e le classi di test di base. Quel progetto aveva altre dipendenze di test che non avevo incluso e ho ricevuto l'errore "gerarchia incoerente".
Dopo aver copiato le "dipendenze di test" da broadleaf / pom.xml e le variabili delle proprietà associate che hanno fornito le versioni per ciascuna dipendenza in broadleaf / pom.xml, l'errore è scomparso.
Le proprietà erano:
<geb.version>0.9.3</geb.version>
<spock.version>0.7-groovy-2.0</spock.version>
<selenium.version>2.42.2</selenium.version>
<groovy.version>2.1.8</groovy.version>
Le dipendenze erano:
<dependency>
<groupId>org.broadleafcommerce</groupId>
<artifactId>integration</artifactId>
<type>jar</type>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.broadleafcommerce</groupId>
<artifactId>broadleaf-framework</artifactId>
<version>${blc.version}</version><!--$NO-MVN-MAN-VER$ -->
<classifier>tests</classifier>
</dependency>
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.3</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>2.5.1</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymockclassextension</artifactId>
<version>2.4</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.9</version>
<type>jar</type>
<classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovy.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gebish</groupId>
<artifactId>geb-core</artifactId>
<version>${geb.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gebish</groupId>
<artifactId>geb-spock</artifactId>
<version>${geb.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>${spock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>${selenium.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>${selenium.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>${selenium.version}</version>
<scope>test</scope>
</dependency>
<!-- Logging -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.1</version>
<type>jar</type>
<scope>test</scope>
</dependency>
Se la classe estesa presenta il problema, verrà visualizzato il messaggio di errore sopra riportato.
Esempio
class Example extends Example1 {
}
risolvere i problemi in Example1
Ho avuto lo stesso identico problema e l'ho risolto rimuovendo l'annotazione @Override da un metodo che era in realtà la prima implementazione (quella "super" essendo un metodo astratto) e non una sostituzione.
Nel mio caso, i riferimenti di importazione in molte classi contenevano una parola in più. Ho risolto modificando tutti i file per avere le importazioni corrette. Ho iniziato a fare le modifiche manualmente. Ma quando ho visto il modello, l'ho automatizzato con un find..replace in eclipse. Questo ha risolto l'errore.
Per me stava cambiando il livello dell'API di Android in uno con le API di Google
Stavo avendo anche questo problema ... Ho scoperto che la gerarchia della classe che stava lanciando questa eccezione, non può essere ricondotta alla sua classe radice con l'eclissi ... Spiego:
Nel mio caso, ho 3 progetti java: A, B e C ... dove A e B sono progetti maven e C un normale progetto java eclipse ...
Nel progetto A, ho l'interfaccia "interfaccia A" ... Nel progetto B, ho l'interfaccia "interfaccia B" che estende "interfaccia A" Nel progetto C, ho la classe concreta "classC" che implementa "interfacciaB"
Il "progetto C" includeva il "progetto B" nel suo percorso di compilazione ma non il "progetto A" (quindi quella era la causa dell'errore) .... Dopo aver incluso il "progetto A" nel percorso di compilazione di "C" , tutto è tornato alla normalità ...
Ho avuto una classe che estende LabelProvider in un progetto con OSGi, lì si è verificato l'errore. La soluzione era: aggiungere org.eclipse.jface ai plugin richiesti in manifest.mf invece di importare i singoli pacchetti come org.eclipse.jface.viewers
se stai importando il progetto eclipse solo 1. Vai all'impostazione del percorso di compilazione java sotto le proprietà del progetto. 2. Nel caso in cui alla libreria del sistema JRE sia associato un segno di errore, fare doppio clic su di essa per aprire la finestra Modifica libreria 3. Modificare l'ambiente di esecuzione con la versione java corretta del sistema o selezionare Modifica le altre impostazioni controllando i pulsanti di opzione a loro. 4. Fai clic su Fine
Ho avuto questo errore dopo aver fatto un po 'di unione git da un ramo in cui le mie classi hanno esteso una nuova interfaccia. È stato sufficiente aggiornare (F5) il File-Tree nel frame Package Explorer di Eclipse.
Sembra che Eclipse non abbia aggiornato tutto correttamente e quindi le classi stessero estendendo un'interfaccia non esistente. Dopo l'aggiornamento, tutti gli errori sono scomparsi.
Ho dovuto passare da Eclipse Oxygen che ho ottenuto da IBM e ho utilizzato IBM JDK 8 a Eclipse Photon e Oracle JDK 8. Sto lavorando alle personalizzazioni Java per massimo.
Maven>Download Sourcesulla dipendenza in questione.