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:

                   

$ {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之外没有依赖项。

难倒(和沮丧)!!

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

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

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

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

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

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

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

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

  1. 转到首选项| Java | JUnit的
  2. 单击“添加包”并添加“org.hamcrest。*”

瞧…问题消失了……

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

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

 lib src/test/java build/test/java                  

我将hamcrest和junit jar文件添加到java / lib / ext目录中,而且它对我来说效果很好。

您缺少的类包含在版本4.4和( 链接 )的junit中。

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

更新:

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

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

我有这个问题试图从运行 – >运行为 – > JUnit测试运行junit测试(我检查,我确实安装了最新的junit插件(junit4_4.5.0))。

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

接下来,从Eclipse中选择项目,我修改了构建路径中的jar文件(项目 – >属性 – > Java构建路径)。 当我第一次尝试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对象库(也称为约束或谓词),允许以声明方式定义“匹配”规则,以便在其他框架中使用。 典型的场景包括测试框架,模拟库和UIvalidation规则。

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

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

JUnit 4.5包括Hamcrest作为其匹配系统的一部分。 您还需要确保在类路径中也有这个JAR文件

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

好。 我终于解决了这个问题。 我不会说“已解决”,因为我仍然对发生了什么感到困惑。 无论如何…

我下载了最新的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任务非常有效。

在eclipse中,当您使用Properties->Libaries->Add External JARs...添加junit jar时会发生这种情况Properties->Libaries->Add External JARs...

而不是使用Properties->Libaries->Add Library... ,它允许您选择Junit3 or Junit4自动将hamcrest库添加到路径中。

通过在\ lib文件夹下放置一个“hamcrest-core-1.3.jar”副本,我遇到了类似的问题。