Ant + JUnit:NoClassDefFoundError

Ste*_*veT 26 java ant junit classpath hamcrest

好的,我很沮丧!我已经狩猎了好几个小时,我仍然难过.

环境:WinXP,Eclipse Galileo 3.5(直接安装 - 无需额外插件).

所以,我有一个简单的JUnit测试.它从内部Eclipse JUnit运行配置运行良好.这个类没有依赖任何东西.为了尽可能缩小这个问题,它只包含:

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}
Run Code Online (Sandbox Code Playgroud)

到目前为止没有汗水.现在我想采取从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>
Run Code Online (Sandbox Code Playgroud)

$ {basedir}是工作空间中包含源,类和构建文件的Java项目名称.所有.java和build.xml都在$ {basedir}/src中..class文件位于$ {basedir}/bin中.

我已经通过Windows/Preferences/Ant/Runtime/Contributed Entries将eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar添加到Ant运行时类路径中.ant-junit.jar在Ant Home Entries中.

那么,当我运行这个疯狂复杂的目标时会发生什么?我的报告文件包含:

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)
Run Code Online (Sandbox Code Playgroud)

这个org.hamcrest.SelfDescribing课是什么?与嘲笑有关?好的.但为什么依赖?我根本没有做任何事情.这实际上是一个Java项目,除了JUnit之外没有依赖项.

难倒(和沮丧)!!

小智 14

我下载了JUnit 4.7并将junit-4.7.jar放在我的构建路径中(而不是旧版本).这解决了它.我没碰到蚂蚁.


dfa*_*dfa 10

将hamcrest.jar添加到测试类路径中


Pål*_*ver 7

我找到了相同问题的原因,但只有在命令行上使用Ant运行测试时才会这样.

您可能希望在调试模式(ant -d)中运行Ant 并注意此语句:

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...
Run Code Online (Sandbox Code Playgroud)

在我的情况下,在运行测试时将此JAR添加到我的类路径的末尾,并在我的Ant脚本中覆盖我的JUnit引用.

事实证明,我的Ant安装与一组较旧的JUnit库捆绑在一起.我不得不删除上面的junit4.jar,以使我的Ant类路径引用生效.