java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing


110

Während des Testens junitin eclipsebekomme ich Folgendes Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Ich habe eine junit.jarBibliotheksdatei hinzugefügt .

Ich habe verschiedene Versionen von junit.jar versucht: 4.4, 4.8usw.

Wie behebe ich diese Ausnahme?


Laut Ihrer Beschreibung junit.jarist nicht mit dem Problem verbunden
Andremoniy

1
Im harcrestGlas ist die Hierarchie gleich? wie in org > hamcrest > SelfDescribing, oder ist es im Stammordner des Glases?
Danyel


1
Dieser Fehler ist möglicherweise nicht für junit jar, vielleicht braucht etwas in Ihrem Projekt ein anderes jar, hier gibt es einige org.hamcrest.SelfDescribing - bekannte Versionen
jdurango

1
Danke, aber ich habe nichts anderes im Projekt, ich habe dieses neue Projekt erstellt.
user2013948

Antworten:


92

Fügen Sie hamcrest-all-X.X.jarIhrem Klassenpfad hinzu .

Die neueste Version vom Februar 2015 ist 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
Wie kann ich es dem Klassenpfad hinzufügen oder prüfen, ob es hinzugefügt wurde oder nicht?
Tomáš Zato - Wiedereinsetzung Monica

Einverstanden, wie das geht wäre hilfreich gewesen. Zum Glück hatte Kommentar unten es.
MarkII

@ TomášZato zuerst: Überprüfen Sie die Datei. Es ist Hamcrest-All (es ist wichtig, alles zu bekommen ). In Idea-IDEs wird eine Abhängigkeit hinzugefügt. 1. Kopieren Sie die Datei in den libs-Ordner (oder irgendwo anders). 2. Klicken Sie mit der rechten Maustaste auf die Datei "Als Bibliothek hinzufügen". 3. Überprüfen Sie Ihre Importanweisungen in Ihren .java-Dateien.
Martin Pfeffer

hamcrest-all-X.X.jarist genug, während viel kleiner.
Elist

1
Datei --- Projektstruktur --- Bibliotheken --- '+' --- Java --- .... jar (Sie haben heruntergeladen) --- OK, es wird in der 'externen Bibliothek' angezeigt.
Simon Z.

56

Nach der JUnit GitHub Team - Website ( https://github.com/junit-team/junit/wiki/Download-and-Install ) junit.jarund hamcrest-core.jarsind in der Classpath beide benötigen , wenn JUnit 4.11 verwenden.

Hier ist der Maven-Abhängigkeitsblock zum Einschließen von Junit und 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>

Ich stehe dem in Junit 5 gegenüber, obwohl es ohne es funktionieren soll
Nikhil Sahu

22

Ein paar Schritte müssen Sie befolgen:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt.
  2. Wählen Sie "Pfad erstellen". Wählen Sie dann im Menü "Bibliotheken hinzufügen".
  3. Wählen Sie JUnit und klicken Sie auf Weiter.
  4. Wählen Sie JUnit4 und dann Fertig stellen.

1
Das hat es für mich behoben. Für jemanden, der nicht an Java / Eclipse gewöhnt ist, war dies äußerst hilfreich. Ich wollte auch erwähnen, dass die von meinem Kursleiter für die Klasse bereitgestellten Labore eine Version von Junit (3 vielleicht) hatten, die nicht mit meinem Labor / meiner Version von Eclipse funktionierte. Ich musste es entfernen und 4 hinzufügen und jetzt ist alles gut. Vielen Dank.
Tony

Dies funktioniert nicht, wenn Sie den Build über die Eingabeaufforderung ausführen. Dies ist eine reine "IDE" -Lösung.
Partha

16

Funktioniert für mich: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Ich habe die Datei im Projektpfad geändert: [PROJECT_NAME] .iml

Ersetzt:

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

Durch:

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

Die endgültige IML-Datei lautet also:

<?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: Speichern Sie die Datei und lassen Sie sie nicht von IntelliJ Idea neu laden. Nur einmal.


Sehr toll!! Hilft mir bei meinem aktuellen Projekt.
MarkII

4

Sie benötigen junit-dep.jar, da die junit.jar eine Kopie der alten Hamcrest-Klassen enthält.


3

Dieses Problem liegt an Ihrem Klassenpfad miss hamcrest-core-1.3.jar. Um dies zu beheben, fügen Sie hamcrest-core-1.3.jar hinzu, während Sie junit-4.XX.jar in Ihren Klassenpfad einfügen.

Zuerst stoße ich auch auf dieses Problem, aber nachdem ich auf die offizielle Seite verwiesen und hamcrest-core-1.3.jar in den Klassenpfad mit der Befehlszeile eingefügt habe, funktioniert es schließlich ordnungsgemäß.

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

Stellen Sie in der Regel immer sicher, dass sich hamcrest vor allen anderen Testbibliotheken im Klassenpfad befindet, da viele dieser Bibliotheken hamcrest-Klassen enthalten und daher möglicherweise mit der von Ihnen verwendeten hamcrest-Version in Konflikt stehen. Dadurch werden die meisten Probleme des von Ihnen beschriebenen Typs behoben.


2

Nur für den Fall, dass hier jemand Netbeans verwendet und das gleiche Problem hat, müssen Sie nur noch etwas tun

  • Klicken Sie mit der rechten Maustaste auf TestLibraries
  • Klicken Sie auf Bibliothek hinzufügen
  • Wählen Sie JUnit und klicken Sie auf Bibliothek hinzufügen
  • Wiederholen Sie den Vorgang, aber klicken Sie diesmal auf Hamcrest und dann auf Bibliothek hinzufügen

Dies sollte das Problem lösen


Danke, das funktioniert bei mir. Ich hatte bereits die JUnit-Bibliothek, aber mir fehlte das Hamcrest.
S. Mayol


1

Es klingt wie ein Klassenpfadproblem, daher gibt es verschiedene Möglichkeiten, dies zu tun. Woher kommt org / hamcret / SelfDescribing? Ist das deine Klasse oder in einem anderen Glas?

Gehen Sie zu Ihrem Projektpfad und fügen Sie auf der Registerkarte Bibliotheken eine Bibliothek hinzu. Sie sollten in der Lage sein, JUnit für Ihr Projekt auszuwählen. Dies ist ein bisschen anders als nur die JUnit-JAR-Datei in Ihrem Projekt.

Überprüfen Sie in Ihrer Ausführungskonfiguration für den JUnit-Test den Klassenpfad. Sie können dies wahrscheinlich beheben, indem Sie hinzufügen, dass Ihr Klassenpfad diese SelfDescribing-Klasse dort sehen kann. Die Option Ausführen in Eclipse bietet verschiedene Optionen für die JUnit-Optionen.


Es ist kein Problem mit dem Klassenpfad, da ich bereits eine Junit-Bibliotheksdatei im Erstellungspfad hinzugefügt habe. Selbst in der Junit-Bibliothek gibt es einen Verweis auf hamcrest, dh C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948

danke für deine antwort, testNG funktioniert gut, es sieht so aus, als müsste ich am
junit

Ich dachte nur, dass JUnit tatsächlich eine neue JVM startet, wenn Sie etwas als Komponententest ausführen. Das bedeutet, dass manchmal ein anderer Klassenpfad als in Ihrem Projekt verwendet wird. Manchmal drucke ich zum Debuggen dieser Art von Dingen den Java-Klassenpfad aus meinem Code aus, damit ich die Unterschiede bei der Ausführung vergleichen kann. java-tips.org/java-se-tips/java.lang/…
Logan

1

Wenn dieses Problem in einem RCP-Projekt auftritt, kann dies daran liegen, dass JUnit explizit importiert wurde.

Überprüfen Sie den Editor auf Ihre Registerkarte plugin.xmlunter Dependencies, entfernen Sie die org.junitaus den importierten Paketen und fügen Sie org.junitsie den erforderlichen Plug-Ins hinzu.


1

Das Problem ist, wenn Sie Eclipse so einrichten, dass es auf JRE anstelle von JDK verweist . JRE hat junit4.jarim lib/extOrdner, aber nicht hamcrest.jar:) Die Lösung besteht also darin, installierte JREs in Eclipse zu überprüfen, die vorhandene zu entfernen und eine neue zu erstellen, die auf Ihr JDK verweist .


1

Die einfachste Möglichkeit, das Problem zu lösen, besteht darin, die neueste Version von hamcrest-code.jar in Ihren CLASSPATH zu kopieren. Dies ist die Datei, in der Sie andere .jar-Dateien speichern, die zum Kompilieren und Ausführen Ihrer Anwendung benötigt werden.

das könnte zB sein: C: / ant / lib


1

Dies geschieht, wenn Sie Ant über die Befehlszeile ausführen. Die impliziten Benutzerabhängigkeiten werden am Ende im Klassenpfad hinzugefügt und haben Vorrang vor dem vom Projekt hinzugefügten Klassenpfad. Führen Sie Ant mit -nouserlibFlagge aus. Die impliziten Abhängigkeiten würden aus dem Klassenpfad ausgeschlossen.


1

Es gibt eine bessere Antwort, um dieses Problem zu lösen. Abhängigkeit hinzufügen

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

0

Ich hatte das gleiche Problem, die Lösung besteht darin, im Build-Pfad / Plugin das JAR org.hamcrest.core_1xx hinzuzufügen. Sie finden es in Eclipse / Plugins.


0

Ein paar Schritte müssen Sie befolgen:

  • Klicken Sie mit der rechten Maustaste auf das Projekt.
  • Wählen Sie "Pfad erstellen" und dann im Menü "Bibliotheken hinzufügen".
  • Wählen Sie JUnit und klicken Sie auf Weiter.
  • Wählen Sie JUnit4 und dann Fertig stellen.

Das funktioniert bei mir ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.