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 через 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.
В тупик (и разочарование)!