java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing


110

Під час запуску junitтесту в eclipseя отримую це Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Я додав junit.jarфайл бібліотеки.

Я пробував різні версії junit.jar: 4.4, 4.8і т.д.

Як виправити цей виняток?


За вашим описом, junit.jarне пов’язаний із проблемою
Андремоній

1
Чи harcrestє в ієрархії ієрархія однаковою? як у org > hamcrest > SelfDescribing, чи це в кореневій папці банку?
Даніель


1
ця помилка може бути не для баночки, можливо, щось у вашому проекті потребує іншої банки, ось деякі org.hamcrest.SelfDescribing - відомі версії
jdurango

1
Дякую, але в мене немає нічого іншого в проекті, я створив цей новий проект.
користувач2013948

Відповіді:


92

Додайте hamcrest-all-X.X.jarдо свого курсу .

Остання версія станом на лютий 2015 року становить 1,3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
Як я можу додати його до classpath або перевірити, додано чи ні?
Томаш Зато - Відновити Моніку

Домовились, як зробити це було б корисно. На щастя, коментар нижче мав це.
МаркII

@ TomášZato спочатку: перевірте файл. це hamcrest-all (важливо отримати всіх ). У Idea-IDE додається залежність: 1. скопіюйте / вставте файл у папку libs (або деінде) 2. клацніть правою кнопкою миші файл "add as library".
Мартін Пфеффер

hamcrest-all-X.X.jarдостатньо, хоча набагато менше.
Еліст

1
Файл --- Структура проекту --- Бібліотеки --- '+' --- Java --- .... jar (ви завантажили) --- ОК, він відображатиметься у "зовнішній бібліотеці".
Simon Z.

56

За даними сайту команди JUnit GitHub ( https://github.com/junit-team/junit/wiki/Download-and-Install ), junit.jarі hamcrest-core.jarобидва необхідні в дорозі до класам при використанні JUnit 4.11.

Ось блок залежності Maven для включення джуніту та хомресту.

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

Я зіткнувся з цим у 5 червня, хоча, мабуть, буде працювати без нього
Нікхіл Саху

22

Кілька кроків, які ви повинні виконати:

  1. Клацніть правою кнопкою миші на проекті.
  2. Виберіть «Створити шлях». Потім у своєму меню виберіть «Додати бібліотеки».
  3. Виберіть JUnit та натисніть кнопку Далі.
  4. Виберіть JUnit4, а потім Готово.

1
Це зафіксувало це для мене. Для тих, хто не звик користуватися java / Eclipse, це було надзвичайно корисно. Я також хотів зазначити, що лабораторії, надані моїм інструктором для класу, мали версію Junit (можливо 3), яка не працювала з моєю лабораторією / версією Eclipse. Мені довелося її вийняти і додати 4, і все зараз добре. Дуже дякую.
Тоні

Це не працює, коли ви запускаєте збірку за допомогою командного рядка. Це єдине рішення "IDE".
Парта

16

Для мене працює: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Я змінив файл у шляху проекту: [PROJECT_NAME] .iml

Замінено:

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

Отже, остаточний .iml-файл:

<?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: збережіть файл і не дозволяйте IntelliJ Idea перезавантажувати його. Тільки один раз.


Супер приємно !! Допомагає мені в моєму поточному проекті.
МаркII


3

Ця проблема через те, що ваш класний шлях пропустив hamcrest-core-1.3.jar. Для вирішення цього питання додайте hamcrest-core-1.3.jar, додаючи junit-4.XX.jar у свій класний шлях.

Спочатку я теж стикаюся з цією проблемою, але після того, як я перейду на офіційний сайт і додаю hamcrest-core-1.3.jar в classpath з командним рядком, він нарешті працює належним чином.

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

Як правило, завжди переконайтеся, що hamcrest є перед будь-якими іншими тестовими бібліотеками на classpath, оскільки багато таких бібліотек включають класи hamcrest і, отже, можуть суперечити версії hamcrest, яку ви використовуєте. Це дозволить вирішити більшість проблем типу, який ви описуєте.


2

На всякий випадок, якщо хтось тут використовує мережеві боби і має ту саму проблему, все, що вам потрібно зробити - це

  • Клацніть правою кнопкою миші на TestLibraries
  • Клацніть на Додати бібліотеку
  • Виберіть JUnit та натисніть кнопку Додати бібліотеку
  • Повторіть процес, але цього разу натисніть на Hamcrest і натисніть бібліотеку "Додати"

Це повинно вирішити проблему


Дякую, це працює для мене. У мене вже була бібліотека JUnit, але мені не вистачало Hamcrest.
С. Майоль


1

Це звучить як питання про класний шлях, тому існує кілька різних способів вирішити цю проблему. Звідки походить org / hamcret / SelfDescribing? Це ваш клас чи в іншій банці?

Спробуйте перейти до проекту «Шлях побудови» та на вкладці «Бібліотеки» додати бібліотеку. Ви повинні мати можливість вибрати JUnit для свого проекту. Це дещо інакше, ніж просто наявність файлу jar JUnit у вашому проекті.

У налаштуваннях запуску для тесту JUnit перевірте Classpath. Ви можете, можливо, це виправити, додавши, переконавшись, що ваш Classpath бачить клас самозапису. Параметр Run у Eclipse має інший набір параметрів для параметрів JUnit.


це не проблема classpath, оскільки я вже додав файл бібліотеки junit на шляху збірки, навіть у бібліотеці junit є посилання на hamcrest, тобто C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
користувач2013948

дякую за вашу відповідь, testNG працює нормально, схоже, мені доведеться вийти з
липня

Я просто думав, що JUnit насправді запускає новий JVM, коли ви запускаєте щось як одиничне тестування. Це означає, що він використовує інший класний шлях, ніж ваш проект іноді. Іноді для налагодження таких типів речей я роздруковую класний шлях java зі свого коду, тому я можу порівняти відмінності при його виконанні. java-tips.org/java-se-tips/java.lang/…
Логан

1

Якщо ця проблема виникає в проекті RCP, це може бути через те, що JUnit був явно імпортований.

Перевірте редактор для вашого plugin.xmlпід Dependenciesвкладки, видаліть org.junitз імпортованих пакетів і додати org.junitв модулі.


1

Проблема полягає в тому, що ви встановлюєте затемнення, щоб вказати на JRE замість JDK . JRE є junit4.jarв lib/extпапці, але ні hamcrest.jar:) Отже, рішення полягає в тому, щоб перевірити встановлені JRE в Eclipse, видалити існуючий та створити новий, що вказує на ваш JDK .


1

найпростіший спосіб вирішити проблему для початку - скопіювати останню версію hamcrest-code.jar у свій CLASSPATH, це файл, у якому ви зберігаєте інші .jar файли, необхідні для компіляції та запуску вашої програми.

це може бути, наприклад: C: / ant / lib


1

Це відбувається, коли ви запускаєте Ant за допомогою командного рядка. Неявні користувальницькі залежності додаються на шляху класу в кінці і мають перевагу над доданим проектом класним шляхом. Виконати мурашку з -nouserlibпрапором. Неявні залежності були б виключені з класового шляху.


1

Для вирішення цієї проблеми є краща відповідь. додайте залежність

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

0

У мене була така ж проблема. Рішення полягає в тому, щоб додати в шлях збірки / плагіна jar org.hamcrest.core_1xx, ви можете знайти його у eclipse / plugins.


0

Кілька кроків, які ви повинні виконати:

  • Клацніть правою кнопкою миші на проекті.
  • Виберіть Збірка контуру і потім у своєму меню виберіть Додати бібліотеки.
  • Виберіть JUnit та натисніть кнопку Далі.
  • Виберіть JUnit4, а потім Готово.

Це працює для мене ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.