Ant + JUnit:NoClassDefFoundError

时间:2009-07-23 11:56:13

标签: java ant junit classpath hamcrest

好的,我很沮丧!我已经狩猎了好几个小时而且仍然难倒。

环境: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。

我已经通过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)

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

难倒(和沮丧)!!

15 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:10)

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

答案 2 :(得分:7)

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

您可能希望以调试模式(ant -d)运行Ant并注意此声明:

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

我的情况是,在运行测试时,这个JAR被添加到我的类路径的末尾,并在我的Ant脚本中覆盖了我的JUnit引用。

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

答案 3 :(得分:3)

在eclipse中面对完全相同的问题但是按照给定的步骤解决了它

  1. 转到首选项| Java | JUnit的
  2. 点击“添加套餐”并添加“org.hamcrest。*”
  3. 瞧瞧......问题已经消失了......

答案 4 :(得分:2)

我遇到了同样的问题并尝试了很多方法来改变类路径。对我来说最简单的解决方案是在junit目标处使用参数fork =“no”。似乎Eclipse可以“自动”比我做得更好......

答案 5 :(得分:2)

我遇到了与jUnit 4.11,Ant和Ivy相同的问题。 这段代码对我有用,但你必须确保你的lib文件夹中有 hamcrest-core-1.3.jar(对于jUnit 4.11)

<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>

答案 6 :(得分:2)

我将hamcrest和junit jar文件添加到java / lib / ext目录中,而且它对我来说还不错。

答案 7 :(得分:1)

您缺少的课程包含在版本4.4和(link)的junit中。

检查旧版本的jUnit是否在您的类路径中。尝试在命令shell中运行ant脚本以查看是否收到相同的错误。如果你这样做,那么很可能ant使用的是早于4.4的jUnit版本

<强>更新

查看ANT_HOME文件夹。右键单击build.xml文件,在Run As ..对话框中选择第二个“Ant build”。将打开一个用于编辑ant run配置的对话框(可能有一种更简单的方法来打开它)。转到Classpath选项卡。在类路径(ant的lib文件夹)中添加最新的junit。

答案 8 :(得分:1)

我从顶层搜索了Eclipse安装目录中的“ hamcrest .jar”(这个网络帖子中没有显示的hamcrest周围的通配符'*')。然后我将一个找到的jar文件添加到Ant build.xml中的类路径中。固定。

答案 9 :(得分:1)

我试图从Run运行junit测试时遇到此问题 - &gt;运行方式 - &gt; JUnit测试 (我检查过,我确实安装了最新的junit插件(junit4_4.5.0)。

我在eclipse安装主目录中创建了一个新目录(externalJars),在那里下载了最新的junit jar(4.8.1)。

接下来,从Eclipse中选择项目,我修改了构建路径中的jar文件(Project - &gt; Properties - &gt; Java Build Path)。当我第一次尝试junit时,我从插件/ org.junit4_4.5.0.v20090824文件夹中添加了junit jar文件。我删除了这个jar文件,然后通过单击“Add External Jars”按钮将externalJars / junit-4.8.1.jar(我刚下载的那个)添加到构建路径。

hamcrest.org是一个“匹配器”库。您可以在以下网址找到信息:

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

提供一个matcher对象库(也称为约束或谓词),允许以声明方式定义“匹配”规则,以便在其他框架中使用。典型的场景包括测试框架,模拟库和UI验证规则。

Hamcrest已移植到Java,C ++,Objective-C,Python和PhP。

注意:Hamcrest它不是一个测试库:只是匹配器对测试非常有用。

答案 10 :(得分:0)

JUnit 4.5包含Hamcrest作为其匹配系统的一部分。你也想确保你的类路径上也有这个JAR文件

答案 11 :(得分:0)

我认为不需要将JUnit jar添加到Ant类路径中。相反,请检查Java Build Path中是否有JUnit库(Windows / Preferences / Java / Build Path / Classpath Variables)。

答案 12 :(得分:0)

行。我终于解决了这个问题。我不会说“已解决”,因为我仍然对发生了什么感到困惑。总之...

我下载了最新的Ant(1.7.1)和JUnit(4.6)并将它们分解到一个外部目录中 - 不是在工作区中或以任何方式“在”Eclipse中。

然后我转到Windows / Preferences / Ant / Runtime / Classpath / Ant Home Entries并杀死所有现有(默认)值。我用新下载的Ant lib目录的内容替换它们。

然后我在全局条目中添加了下载的junit.jar。它包含org.hamcrest类,就像Eclipse中包含的junit.jar一样,所以我不知道为什么这是必要的,但确实如此。

就是这样。我在构建文件中的junit任务非常有效。

答案 13 :(得分:0)

在eclipse中,当您使用Properties->Libaries->Add External JARs...

添加junit jar时会发生这种情况

而不是使用允许您选择Properties->Libaries->Add Library...的{​​{1}}和自动将hamcrest库添加到路径中。

答案 14 :(得分:0)

我遇到了类似的问题,我在