Ant + JUnit: NoClassDefFoundError

Хорошо, я расстроен! Я охотился вокруг в течение многих часов, и я все еще в тупике.

Окружающая среда: WinXP, Eclipse Galileo 3.5 (прямое установление - без дополнительных плагинов).

Итак, у меня есть простой тест JUnit. Он отлично работает из внутренней конфигурации Eclipse JUnit. Этот класс не имеет никакого отношения ни к чему. Чтобы максимально уменьшить эту проблему, она просто содержит:

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}

Пока нет пота. Теперь я хочу сделать супер-продвинутый шаг запуска этого тестового примера из Ant (конечной целью является интеграция с Hudson).

Итак, я создаю файл build.xml:

<project name="Test" default="basic">
    <property name="default.target.dir" value="${basedir}/target" />
    <property name="test.report.dir" value="${default.target.dir}/test-reports" />

    <target name="basic">
        <mkdir dir="${test.report.dir}" />
        <junit fork="true" printSummary="true" showOutput="true">
            <formatter type="plain" />
            <classpath>
                <pathelement path="${basedir}/bin "/>
            </classpath>
            <batchtest fork="true" todir="${test.report.dir}" >
                <fileset dir="${basedir}/bin">
                    <include name="**/*Test.*" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

${basedir} - это имя проекта Java в рабочей области, которая содержит исходный код, классы и файл сборки. Все .java и build.xml находятся в ${basedir}/src. Файлы .class находятся в ${basedir}/bin.

Я добавил eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar в класс Ant Runtime Classpath через Windows/Preferences/Ant/Runtime/Contributed Entries. ant -junit.jar находится в Ant Домашних записях.

Итак, что происходит, когда я запускаю эту безумно сложную цель? Мой файл отчета содержит:

Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Что это за класс org.hamcrest.SelfDescribing? Что-то делать с насмешками? Хорошо. Но почему зависимость? Я ничего не делаю с этим. Это буквально проект Java без зависимостей, кроме JUnit.

Вставлено (и расстроено)!!

Ответ 1

Я загрузил JUnit 4.7 и поместил junit-4.7.jar в мой путь сборки (вместо старой версии). Это решило. Я не касался ant.

Ответ 2

добавьте также hamcrest.jar в ваш путь к классу тестирования

Ответ 3

Я нашел причину идентичной проблемы, но только при запуске теста с Ant в командной строке.

Возможно, вы захотите запустить Ant в режиме отладки (ant -d) и следить за этим утверждением:

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...

В моем случае этот JAR был добавлен в конец моего пути к классам при запуске теста и переопределил мою ссылку JUnit в моем Ant script.

Оказалось, что моя установка Ant была в комплекте с набором более старых JUnit libs. Мне пришлось удалить junit4.jar выше, чтобы сделать мой способ Ant classpath ref вступить в силу.

Ответ 4

Столкнувшись с той же проблемой в eclipse, но разрешив ее, выполните указанные шаги

  • Перейти к настройкам | Java | JUnit
  • Нажмите "Добавить пакет" и добавьте "org.hamcrest. *"

Воила... проблема ушла.

Ответ 5

У меня была такая же проблема, и я попытался изменить путь к классам. Самое простое решение для меня состояло в том, чтобы использовать параметр fork = "no" в целевой точке junit. Кажется, что Eclipse может "автоматически" сделать это лучше меня...

Ответ 6

У меня была такая же проблема с jUnit 4.11, Ant и Ivy. Этот код работает для меня, но вы должны убедиться, что у вас есть hamcrest-core-1.3.jar(для jUnit 4.11) в вашей папке lib.

<property name="lib.dir">lib</property>
<property name="test.dir">src/test/java</property>
<property name="build.test">build/test/java</property>

<path id="test.path.id">
    <path location="${build.test}" />
    <path refid="lib.path.id" />
</path>

<path id="lib.path.id">
    <fileset dir="${lib.dir}" />
</path>

<!-- ================================= 
              Runs Tests         
================================= -->
<target name="junit">
    <junit>
        <classpath refid="test.path.id" />
        <batchtest>
            <fileset dir="${test.dir}" />
        </batchtest>
        <formatter type="plain" usefile="false" />
    </junit>
</target>

Ответ 7

Я искал каталог установки Eclipse с верхнего уровня для "hamcrest.jar" (подстановочный знак * * вокруг hamcrest, который не отображается в этом веб-сообщении). Затем я добавил найденный jar файл в путь к классам в Ant build.xml. Исправлена.

Ответ 8

У меня была эта проблема с попыткой запуска тестов junit из Run → Run As → JUnit Test (Я проверил, и у меня установлен последний плагин junit (junit4_4.5.0)).

Я создал новый каталог (внешниеJars) в главном каталоге установки eclipse, загрузил самую последнюю junit jar (4.8.1) там.

Далее, из Eclipse, с выбранным проектом, я изменил файлы jar в пути сборки (Project → Properties → Java Build Path). Когда я впервые попробовал junit, я добавил файл junit jar из папки plugin/org.junit4_4.5.0.v20090824. Я удалил этот файл jar, и я добавил внешнийJars/junit-4.8.1.jar(тот, который я только что загрузил) в путь сборки, нажав кнопку "Добавить внешние банки".

hamcrest.org - это библиотека "матчи". Вы можете найти информацию по адресу:

http://code.google.com/p/hamcrest/

Предоставляет библиотеку объектов-совпадений (также называемых ограничениями или предикатами), позволяющих декларативно определять правила соответствия, которые будут использоваться в других рамках. Типичные сценарии включают в себя тестовые рамки, насмешливые библиотеки и правила проверки UI.

Hamcrest был перенесен на Java, С++, Objective-C, Python и PhP.

Примечание: Hamcrest это не тестовая библиотека: просто случается, что матчи очень полезны для тестирования.

Ответ 9

Я добавил файлы hamcrest и junit jar в каталог java/lib/ext, и он отлично работал у меня.

Ответ 10

JUnit 4.5 включает Hamcrest как часть его системы согласования. Вы хотите, чтобы у вас был этот JAR файл на вашем пути к классу.

Ответ 11

Класс, который вам не хватает, включен в junit с версии 4.4 и дальше (ссылка).

Проверьте, находится ли более старая версия jUnit в вашем пути к классам. Попробуйте запустить ant script в командной оболочке, чтобы узнать, есть ли у вас такая же ошибка. Если вы это сделаете, то, вероятно, ant использует версию jUnit старше 4.4

Update:

Посмотрите папку ANT_HOME. Щелкните правой кнопкой мыши файл build.xml, выберите вторую "Ant build" в диалоговом окне "Запуск от имени". Откроется диалоговое окно для редактирования конфигурации запуска ant (там может быть более простой способ открыть это). Перейдите на вкладку Classpath. Добавьте новый junit в путь к классам (папка lib ant).

Ответ 12

Я не думаю, что необходимо добавить JUnit jar в ваш путь к Ant. Вместо этого убедитесь, что у вас есть библиотека JUnit в вашем пути сборки Java (переменные Windows/Preferences/Java/Build Path/Classpath).

Ответ 13

OK. Я, наконец, обошел эту проблему. Я не буду говорить "разрешен", так как я все еще довольно смущен в отношении того, что происходит. В любом случае...

Я загрузил последние Ant (1.7.1) и JUnit (4.6) и взорвал их во внешний каталог - НЕ в рабочей области или в "Eclipse".

Затем я перешел в Windows/Preferences/ Ant/Runtime/Classpath/Ant Домашние записи и убьет все существующие (по умолчанию) значения. Я заменил их содержимым недавно загруженного каталога Ant lib.

Затем я добавил загруженный junit.jar в Global Entries. Он содержит классы org.hamcrest, как и junit.jar, включенные в Eclipse, поэтому я не знаю, почему это необходимо, но это так.

Что это. Моя задача junit в файле сборки работает отлично.

Ответ 14

В eclipse это происходит, когда вы добавляете junit jar с помощью Properties->Libaries->Add External JARs...

Вместо использования Properties->Libaries->Add Library..., который позволяет вам выбрать Junit3 or Junit4 и , автоматически добавляет библиотеку hamcrest в путь.

Ответ 15

У меня была аналогичная проблема, которую я преодолел, разместив копию "hamcrest-core-1.3.jar" в папке\lib.