java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing


110

Durante l'esecuzione del junittest eclipsericevo questo Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Ho aggiunto il junit.jarfile della libreria.

Ho provato diverse versioni di junit.jar: 4.4, 4.8, etc.

Come risolvo questa eccezione?


Secondo la tua descrizione, junit.jarnon è correlato al problema
Andremoniy

1
Nel harcrestbarattolo, la gerarchia è la stessa? come in org > hamcrest > SelfDescribing, o è nella cartella principale del vaso?
Danyel


1
questo errore potrebbe non essere per junit jar, forse qualcosa nel tuo progetto ha bisogno di un altro jar, qui ci sono alcuni org.hamcrest.SelfDescribing - versioni conosciute
jdurango

1
Grazie ma non ho nient'altro nel progetto, ho creato questo nuovo progetto.
user2013948

Risposte:


92

Aggiungi hamcrest-all-X.X.jaral tuo classpath .

L'ultima versione di febbraio 2015 è la 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
Come posso aggiungerlo a classpath o verificare se è stato aggiunto o meno?
Tomáš Zato - Ripristina Monica il

D'accordo, come farlo sarebbe stato utile. Fortunatamente il commento qui sotto lo aveva.
MarkII

@ TomášZato prima: controlla il file. è hamcrest-all (è importante ottenere tutto ). In Idea-IDE viene aggiunta una dipendenza 1. copia / incolla il file nella cartella libs (o altrove) 2. fai clic con il pulsante destro del mouse sul file "aggiungi come libreria" 3. controlla le istruzioni di importazione nei tuoi file .java.
Martin Pfeffer

hamcrest-all-X.X.jarè sufficiente mentre molto più piccolo.
Elist

1
File --- Struttura del progetto --- Librerie --- '+' --- Java --- .... jar (che hai scaricato) --- OK, verrà mostrato nella 'libreria esterna'.
Simon Z.16

56

Secondo il sito web del team JUnit GitHub ( https://github.com/junit-team/junit/wiki/Download-and-Install ), junit.jare hamcrest-core.jarsono entrambi necessari nel percorso di classe quando si utilizza JUnit 4.11.

Ecco il blocco delle dipendenze di Maven per includere junit e hamcrest.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.2</version>
    <scope>test</scope>
</dependency>
<!-- Needed by junit -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

Lo affronterò il 5 giugno anche se dovrebbe funzionare senza di esso
Nikhil Sahu

22

Alcuni passaggi da seguire:

  1. Fare clic con il tasto destro sul progetto.
  2. Scegli Build Path Quindi dal suo menu scegli Add Libraries.
  3. Scegli JUnit quindi fai clic su Avanti.
  4. Scegli JUnit4 quindi Fine.

1
Questo ha risolto il problema per me. Per qualcuno che non è abituato a usare java / Eclipse questo è stato estremamente utile. Volevo anche menzionare che i laboratori forniti dal mio istruttore per la classe avevano una versione di Junit (3 forse) che non funzionava con il mio Lab / versione di Eclipse. Ho dovuto rimuoverlo e aggiungerne 4 e ora va tutto bene. Molte grazie.
Tony

Questo non funziona quando esegui la build utilizzando il prompt dei comandi. Questa è una soluzione unica "IDE".
Partha

16

Funziona per me: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Ho cambiato il file nel percorso del progetto: [PROJECT_NAME] .iml

sostituito:

  <library>
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

Di:

  <library name="JUnit4">
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

Quindi il file .iml finale è:

<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="module-library">
      <library name="JUnit4">
        <CLASSES>
          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
  </component>
</module>

PS: salva il file e non lasciarlo ricaricare a IntelliJ Idea. Solo una volta.


Super fantastico !! Mi aiuta con il mio progetto attuale.
MarkII

4

È necessario junit-dep.jar perché junit.jar ha una copia delle vecchie classi Hamcrest.


3

Questo problema è dovuto al tuo classpath miss hamcrest-core-1.3.jar. Per risolvere questo problema, aggiungi hamcrest-core-1.3.jar mentre aggiungi junit-4.XX.jar nel tuo classpath.

All'inizio, ho riscontrato anche questo problema, ma dopo aver fatto riferimento al sito ufficiale e aggiunto hamcrest-core-1.3.jar in classpath con la riga di comando, finalmente funziona correttamente.

javac -d ../../../../bin/ -cp ~/libs/junit-4.12.jar:/home/limxtop/projects/algorithms/bin  MaxHeapTest.java 

java -cp ../../../../bin/:/home/limxtop/libs/junit-4.12.jar:/home/limxtop/libs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore com.limxtop.heap.MaxHeapTest

2

Come regola generale, assicurati sempre che hamcrest sia prima di qualsiasi altra libreria di test sul classpath, poiché molte di queste librerie includono classi hamcrest e potrebbero quindi entrare in conflitto con la versione di hamcrest che stai utilizzando. Questo risolverà la maggior parte dei problemi del tipo che stai descrivendo.


2

Nel caso ci sia qualcuno qui che usa netbeans e ha lo stesso problema, tutto quello che devi fare è

  • Fare clic con il tasto destro su TestLibraries
  • Fare clic su Aggiungi libreria
  • Seleziona JUnit e fai clic su aggiungi libreria
  • Ripeti il ​​processo ma questa volta fai clic su Hamcrest e fai clic su aggiungi libreria

Questo dovrebbe risolvere il problema


Grazie, questo funziona per me. Avevo già la libreria JUnit ma mi mancava Hamcrest.
S. Mayol


1

Sembra un problema di percorso di classe, quindi ci sono diversi modi per risolverlo. Da dove viene org / hamcret / SelfDescribing? È la tua classe o in un barattolo diverso?

Prova ad andare al percorso di creazione del tuo progetto e nella scheda Librerie, aggiungi una libreria. Dovresti essere in grado di scegliere JUnit per il tuo progetto. Questo è leggermente diverso dal semplice avere il file jar JUnit nel tuo progetto.

Nella tua configurazione di esecuzione per il test JUnit, controlla il Classpath. Probabilmente potresti risolvere questo problema aggiungendo assicurandoti che il tuo Classpath possa vedere quella classe SelfDescribing lì. L'opzione Esegui in Eclipse ha un diverso insieme di opzioni per le opzioni JUnit.


non è un problema di classpath poiché ho già aggiunto il file della libreria junit nel percorso di compilazione, anche nella libreria junit c'è un riferimento a hamcrest cioè C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948

grazie per la tua risposta, testNG funziona bene, sembra che dovrò chiudere su junit
user2013948

Stavo solo pensando che JUnit avvia effettivamente una nuova JVM quando esegui qualcosa come test unitario. Ciò significa che a volte utilizza un percorso di classe diverso dal tuo progetto. A volte per eseguire il debug di questo tipo di cose stampo il classpath java dal mio codice, così posso confrontare le differenze quando viene eseguito. java-tips.org/java-se-tips/java.lang/…
Logan

1

Se questo problema si verifica in un progetto RCP, può essere perché JUnit è stato importato esplicitamente.

Controlla l'editor per la tua scheda plugin.xmlin Dependenciesbasso, rimuovi org.junitdai pacchetti importati e aggiungi org.junitai plug-in richiesti.


1

Il problema è quando si imposta eclipse in modo che punti a JRE invece che a JDK . JRE ha junit4.jarnella lib/extcartella, ma non hamcrest.jar:) Quindi la soluzione è controllare i JRE installati in Eclipse, rimuovere quello esistente e crearne uno nuovo che punta al tuo JDK .


1

il modo più semplice per risolvere il problema per cominciare è copiare l'ultima versione di hamcrest-code.jar nel tuo CLASSPATH, ovvero il file in cui memorizzi altri file .jar necessari per la compilazione e l'esecuzione dell'applicazione.

potrebbe essere ad esempio: C: / ant / lib


1

Questo accade quando esegui Ant tramite riga di comando. Le dipendenze utente implicite vengono aggiunte al classpath alla fine e hanno la precedenza sul classpath aggiunto al progetto. Corri Ant con la -nouserlibbandiera. Le dipendenze implicite verrebbero escluse dal classpath.


1

C'è una risposta migliore per risolvere questo problema. aggiungi dipendenza

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

0

Ho avuto lo stesso problema, la soluzione è aggiungere in build path / plugin il jar org.hamcrest.core_1xx, lo trovi in ​​eclipse / plugins.


0

Alcuni passaggi da seguire:

  • Fare clic con il tasto destro sul progetto.
  • Scegli Crea percorso e dal suo menu scegli Aggiungi librerie.
  • Scegli JUnit quindi fai clic su Avanti.
  • Scegli JUnit4 quindi Fine.

Questo funziona per me ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.