it-roy-ru.com

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 Ant Classpath через Windows/Preferences/Ant/Runtime/Contributed Entries. ant-junit.jar находится в Ant Home Записи.

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

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.

В тупик (и разочарование)!

26
SteveT

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

14
JB

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

10
dfa

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

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

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

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

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

7
PålOliver

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

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

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

3
Niranjan

У меня была такая же проблема с 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>
2
Alexander Ivanov

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

2
Bananeweizen

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

2
Dilip

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

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

Обновление:

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

1
kgiannakakis

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

1
Rolf

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

Я создал новый каталог (externalJars) в главном каталоге установки Eclipse, загрузил туда самый последний джунит jar (4.8.1).

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

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

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

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

Hamcrest был портирован на Java, C++, Objective-C, Python и PhP.

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

1
Jay Elston

ХОРОШО. Я наконец-то обошел эту проблему. Я не буду говорить «решено», так как все еще не совсем понимаю, что происходит. Тем не мение...

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

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

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

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

0
SteveT

JUnit 4.5 включает в себя Hamcrest как часть своей системы соответствия. Вы захотите убедиться, что этот JAR-файл тоже есть в вашем classpath

0
tddmonkey

У меня была похожая проблема, которую я решил, поместив копию «hamcrest-core-1.3.jar» в папку\lib.

0
Venkat Rao

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

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

0
Iñaqui

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

0
akf