java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing


110

Podczas uruchamiania junittestu w eclipseotrzymuję to Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Dodałem junit.jarplik biblioteki.

Próbowałem różnych wersji junit.jar: 4.4, 4.8, itd.

Jak naprawić ten wyjątek?


Według twojego opisu junit.jarnie ma to związku z problemem
Andremoniy

1
Czy w harcrestsłoiku hierarchia jest taka sama? jak w org > hamcrest > SelfDescribing, czy jest w folderze głównym jar?
Danyel


1
ten błąd może nie dotyczyć junit jar, może coś w twoim projekcie wymaga innego jar, tutaj jest kilka org.hamcrest.SelfDescribing - znane wersje
jdurango

1
Dzięki, ale nie mam nic innego w projekcie, stworzyłem ten nowy projekt.
user2013948

Odpowiedzi:


92

Dodaj hamcrest-all-X.X.jardo swojej ścieżki klas .

Najnowsza wersja z lutego 2015 r. To 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
Jak mogę dodać go do ścieżki klas lub sprawdzić, czy został dodany, czy nie?
Tomáš Zato - Przywróć Monikę

Zgoda, jak to zrobić byłoby pomocne. Na szczęście poniższy komentarz miał to.
Mark II

@ TomášZato pierwszy: sprawdź plik. to wszystko ścięgno (ważne jest, aby zdobyć wszystko ). W Idea-IDE zależność jest dodawana 1. skopiuj / wklej plik do folderu libs (lub gdziekolwiek indziej) 2. kliknij prawym przyciskiem plik „dodaj jako bibliotekę” 3. sprawdź swoje instrukcje importu w plikach .java.
Martin Pfeffer

hamcrest-all-X.X.jarwystarczy, podczas gdy znacznie mniejszy.
Elist

1
Plik --- Struktura projektu --- Biblioteki --- '+' --- Java --- .... jar (pobrałeś) --- OK, pojawi się w 'bibliotece zewnętrznej'.
Simon Z.

56

Według witryny zespołu JUnit GitHub ( https://github.com/junit-team/junit/wiki/Download-and-Install ) junit.jari hamcrest-core.jaroba są potrzebne w ścieżce klas podczas korzystania z JUnit 4.11.

Oto blok zależności Maven do dołączania junit i 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>

Stoję w obliczu tego 5 czerwca, chociaż ma działać bez niego
Nikhil Sahu

22

Kilka kroków, które musisz wykonać:

  1. Kliknij prawym przyciskiem myszy projekt.
  2. Wybierz opcję Buduj ścieżkę Następnie z menu wybierz Dodaj biblioteki.
  3. Wybierz JUnit, a następnie kliknij Dalej.
  4. Wybierz JUnit4, a następnie Zakończ.

1
To naprawiło to dla mnie. Dla kogoś, kto nie jest przyzwyczajony do korzystania z java / Eclipse, było to niezwykle pomocne. Chciałem również wspomnieć, że laboratoria dostarczone przez mojego instruktora na zajęcia miały wersję Junit (być może 3), która nie działała z moim laboratorium / wersją Eclipse. Musiałem go usunąć i dodać 4 i teraz wszystko jest w porządku. Wielkie dzięki.
Tony

To nie działa, gdy uruchamiasz kompilację za pomocą wiersza polecenia. To jest tylko rozwiązanie „IDE”.
Partha

16

U mnie działa: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Zmieniłem plik w ścieżce projektu: [PROJECT_NAME] .iml

Zastąpiono:

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

Przez:

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

Tak więc ostateczny plik .iml to:

<?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: zapisz plik i nie pozwól, aby program IntelliJ Idea załadował go ponownie. Tylko raz.


Super super !! Pomaga mi w moim obecnym projekcie.
Mark II


3

Ten problem jest spowodowany ścieżką klasy miss hamcrest-core-1.3.jar. Aby rozwiązać ten problem, dodaj hamcrest-core-1.3.jar podczas dodawania junit-4.XX.jar do ścieżki klas.

Na początku też napotykam ten problem, ale po odwołaniu się do oficjalnej strony i dodaniu hamcrest-core-1.3.jar do ścieżki klasy za pomocą wiersza poleceń, w końcu działa poprawnie.

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

Zasadniczo zawsze upewnij się, że hamcrest znajduje się przed innymi bibliotekami testowymi na ścieżce klas, ponieważ wiele takich bibliotek zawiera klasy hamcrest i dlatego może kolidować z wersją hamcrest, której używasz. To rozwiąże większość opisywanych problemów.


2

Na wypadek, gdyby ktoś tutaj używał netbeans i ma ten sam problem, wszystko, co musisz zrobić, to

  • Kliknij prawym przyciskiem myszy TestLibraries
  • Kliknij Dodaj bibliotekę
  • Wybierz JUnit i kliknij dodaj bibliotekę
  • Powtórz proces, ale tym razem kliknij Hamcrest, a następnie kliknij dodaj bibliotekę

To powinno rozwiązać problem


Dziękuję, to działa dla mnie. Miałem już bibliotekę JUnit, ale brakowało mi Hamcrest.
S. Mayol


1

Brzmi to jak problem ze ścieżką klas, więc można to zrobić na kilka różnych sposobów. Skąd się bierze org / hamcret / SelfDescribing? Czy to twoja klasa, czy w innym słoiku?

Spróbuj przejść do ścieżki budowania projektu i na karcie Biblioteki dodaj bibliotekę. Powinieneś móc wybrać JUnit do swojego projektu. Jest to trochę inne niż zwykłe umieszczenie pliku jar JUnit w projekcie.

W konfiguracji uruchamiania testu JUnit sprawdź ścieżkę klasy. Prawdopodobnie możesz to naprawić, dodając, że ścieżka klas widzi tam klasę SelfDescribing. Opcja Uruchom w Eclipse ma inny zestaw opcji dla opcji JUnit.


to nie jest kwestia ścieżki klas, ponieważ dodałem już plik biblioteki junit w ścieżce kompilacji, nawet w bibliotece junit jest odniesienie do hamcrest, czyli C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948

dziękuję za odpowiedź, testNG działa dobrze, wygląda na to, że będę musiał rzucić
palenie w junit

Właśnie pomyślałem, że JUnit faktycznie uruchamia nową maszynę JVM, gdy uruchamiasz coś jako test jednostkowy. Oznacza to, że czasami używa innej ścieżki klas niż Twój projekt. Czasami, aby debugować tego typu rzeczy, drukuję ścieżkę klas java z mojego kodu, aby móc porównać różnice podczas wykonywania. java-tips.org/java-se-tips/java.lang/…
Logan

1

Jeśli ten problem pojawia się w projekcie RCP, może to być spowodowane jawnym zaimportowaniem JUnit.

Sprawdź w edytorze swoją kartę plugin.xmlpod Dependencies, usuń org.junitz zaimportowanych pakietów i dodaj org.junitdo wymaganych wtyczek.


1

Problem polega na tym, że skonfigurujesz zaćmienie, aby wskazywało na JRE zamiast JDK . JRE ma junit4.jarw lib/extfolderze, ale nie hamcrest.jar:) Więc rozwiązaniem jest sprawdzenie zainstalowanych JRE w Eclipse, usunięcie istniejącego i utworzenie nowego wskazującego na twój JDK .


1

Najprostszym sposobem rozwiązania problemu jest skopiowanie najnowszej wersji hamcrest-code.jar do swojej CLASSPATH, czyli pliku, w którym przechowujesz inne pliki .jar potrzebne do kompilacji i uruchomienia aplikacji.

może to być np .: C: / ant / lib


1

Dzieje się tak, gdy uruchamiasz Anta z wiersza poleceń. Niejawne zależności użytkownika są dodawane w ścieżce klas na końcu i mają pierwszeństwo przed ścieżką klas dodaną do projektu. Uciekaj Ant z -nouserlibflagą. Niejawne zależności zostałyby wykluczone ze ścieżki klas.


1

Jest lepsza odpowiedź na ten problem. dodaj zależność

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

0

Miałem ten sam problem, rozwiązaniem jest dodanie w ścieżce kompilacji / wtyczki jar org.hamcrest.core_1xx, można go znaleźć w eclipse / plugins.


0

Kilka kroków, które musisz wykonać:

  • Kliknij prawym przyciskiem myszy projekt.
  • Wybierz opcję Buduj ścieżkę, a następnie z menu wybierz Dodaj biblioteki.
  • Wybierz JUnit, a następnie kliknij Dalej.
  • Wybierz JUnit4, a następnie Zakończ.

To działa dla mnie ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.