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, или это в корневой папке баночки?
Danyel


1
эта ошибка может быть не для junit jar, возможно, что-то в вашем проекте нуждается в другом jar, здесь есть некоторые org.hamcrest.SelfDescribing - известные версии
jdurango

1
Спасибо, но у меня в проекте больше ничего нет, я создал этот новый проект.
user2013948

Ответы:


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
Как я могу добавить его в путь к классам или проверить, добавлен он или нет?
Томаш Зато - Восстановите Монику

Согласен, как это сделать, было бы полезно. К счастью, в комментарии ниже это было.
MarkII

@ TomášZato сначала: проверьте файл. это хамкрест-все (важно получить все ). В Idea-IDE добавляется зависимость 1. скопируйте / вставьте файл в папку libs (или где-нибудь еще) 2. щелкните правой кнопкой мыши файл «добавить как библиотеку» 3. проверьте операторы импорта в ваших .java-файлах.
Мартин Пфеффер

hamcrest-all-X.X.jarдостаточно, пока намного меньше.
Elist

1
Файл --- Структура проекта --- Библиотеки --- '+' --- Java --- .... jar (вы скачали) --- Хорошо, это будет отображаться во "внешней библиотеке".
Саймон З.

56

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

Вот блок зависимостей Maven для включения junit и 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>

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

22

Вам необходимо выполнить несколько шагов:

  1. Щелкните проект правой кнопкой мыши.
  2. Выберите «Путь сборки», затем в его меню выберите «Добавить библиотеки».
  3. Выберите JUnit и нажмите Далее.
  4. Выберите JUnit4, затем Готово.

1
Это исправило это для меня. Для тех, кто не привык использовать java / Eclipse, это было чрезвычайно полезно. Я также хотел упомянуть, что в лабораторных работах, предоставленных моим инструктором для этого класса, была версия Junit (возможно, 3), которая не работала с моей лабораторией / версией Eclipse. Мне пришлось удалить его и добавить 4, и теперь все хорошо. Большое спасибо.
Тони

Это не работает, когда вы запускаете сборку из командной строки. Это решение только для "IDE".
Partha

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 перезагружать его. Только раз.


Супер классный!! Помогает мне с моим текущим проектом.
MarkII


3

Эта проблема возникает из-за пропуска вашего пути к классам hamcrest-core-1.3.jar. Чтобы решить эту проблему, добавьте hamcrest-core-1.3.jar при добавлении junit-4.XX.jar в путь к классам.

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

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 находится перед любыми другими тестовыми библиотеками в пути к классам, поскольку многие такие библиотеки включают классы hamcrest и поэтому могут конфликтовать с версией hamcrest, которую вы используете. Это решит большинство проблем описываемого вами типа.


2

На всякий случай, если кто-то здесь использует netbeans и имеет ту же проблему, все, что вам нужно сделать, это

  • Щелкните правой кнопкой мыши TestLibraries.
  • Нажмите на Добавить библиотеку
  • Выберите JUnit и нажмите добавить библиотеку.
  • Повторите процесс, но на этот раз нажмите Hamcrest и нажмите кнопку добавления библиотеки.

Это должно решить проблему


Спасибо, у меня это работает. У меня уже была библиотека JUnit, но мне не хватало Hamcrest.
С. Майоль


1

Это похоже на проблему с путями к классам, поэтому есть несколько способов решить эту проблему. Откуда взялось org / hamcret / SelfDescribing? Это твой класс или в другой банке?

Попробуйте перейти к пути сборки вашего проекта и на вкладке «Библиотеки» добавьте библиотеку. Вы должны иметь возможность выбрать JUnit для своего проекта. Это немного отличается от простого наличия jar-файла JUnit в вашем проекте.

В конфигурации запуска для теста JUnit проверьте путь к классам. Вероятно, вы могли бы исправить это, добавив, чтобы ваш Classpath мог видеть этот класс SelfDescribing. Параметр «Выполнить» в Eclipse имеет другой набор параметров для параметров JUnit.


это не проблема пути к классам, поскольку я уже добавил файл библиотеки junit в путь сборки, даже в библиотеке junit есть ссылка на hamcrest, то есть C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948

спасибо за ответ, testNG работает нормально, похоже, мне придется выйти на junit
user2013948

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

1

Если эта проблема возникает в проекте RCP, это может быть потому, что JUnit был явно импортирован.

Найдите в редакторе свою plugin.xmlнижнюю Dependenciesвкладку, удалите org.junitиз импортированных пакетов и добавьте org.junitк обязательным подключаемым модулям.


1

Проблема в том, что вы настраиваете eclipse так, чтобы он указывал на JRE вместо JDK . JRE есть junit4.jarв lib/extпапке, но нет hamcrest.jar:) Итак, решение состоит в том, чтобы проверить установленные JRE в Eclipse, удалить существующий и создать новый, указывающий на ваш JDK .


1

Самый простой способ решить проблему - это скопировать последнюю версию hamcrest-code.jar в ваш CLASSPATH, то есть в файл, в котором вы храните другие файлы .jar, необходимые для компиляции и запуска вашего приложения.

это может быть, например: C: / ant / lib


1

Это происходит, когда вы запускаете Ant через командную строку. Неявные пользовательские зависимости добавляются в путь к классам в конце и имеют приоритет над путем к классам, добавленным в проект. Запускаем Ant с -nouserlibфлагом. Неявные зависимости будут исключены из пути к классам.


1

Есть лучший ответ для решения этой проблемы. добавить зависимость

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


0

Вам необходимо выполнить несколько шагов:

  • Щелкните проект правой кнопкой мыши.
  • Выберите Путь сборки, а затем в его меню выберите Добавить библиотеки.
  • Выберите JUnit и нажмите Далее.
  • Выберите JUnit4, затем Готово.

Это работает для меня ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.