ANT +的JUnit:NoClassDefFoundError的(Ant + JUnit: NoC

2019-06-26 14:50发布

好吧,我很沮丧! 我猎杀绕了好几个小时,现在还在难倒。

环境:WinXP中,Eclipse的伽利略3.5(直安装 - 没有额外的插件)。

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

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}

无汗至今。 现在,我想借此从内部运行Ant的这种测试案例的超高级步骤(最终目标是与哈德逊集成)。

所以,我创建了一个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 /首选项/ ANT /运行/供稿条目加入Eclipse的安装目录/插件/ org.junit4_4.5.0.v20090423 /的junit.jar到Ant的运行时类路径。 蚂蚁的junit.jar是在Ant主项。

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

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没有依赖关系。

难倒(和沮丧)!!

Answer 1:

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



Answer 2:

加也hamcrest.jar到测试类路径



Answer 3:

我找到了原因,以一个相同的问题,但只能运行在命令行上使用Ant测试时。

您可能要运行Ant在调试模式( ant -d )并观看了这一说法:

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

IM我的情况下,在运行测试时,这个JAR添加到我的类路径的末尾,在我的Ant脚本不顾我的JUnit参考。

原来,我的Ant安装用一套较老的JUnit库的捆绑。 我不得不删除上述junit4.jar为了使我的Ant classpath中裁判生效。



Answer 4:

正是在面对日食同样的问题,但解决它下面给出的步骤

  1. 转到偏好| Java的| JUnit的
  2. 点击“添加包”,并添加“org.hamcrest。*”

瞧...问题消失了..



Answer 5:

我有同样的问题,试过很多方法可以改变类路径。 对我来说,最简单的解决方案是使用参数叉=“否”,在JUnit的目标。 好像Eclipse可以“自动地”做的比我好......



Answer 6:

我有同样的问题,用JUnit 4.11,蚂蚁和常春藤。 此代码对我的作品,但你必须确保你已经在你的lib文件夹hamcrest核-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>


Answer 7:

我加入hamcrest和JUnit jar文件到Java / lib / ext目录,比它为我工作得很好。



Answer 8:

你缺少的类包含在JUnit 4.4版本和( 链接 )。

检查的JUnit的旧版本是在类路径中。 尝试运行Ant脚本的命令外壳,看看你得到同样的错误。 如果这样做,那么很可能蚂蚁使用JUnit版本比4.4更旧

更新:

看看ANT_HOME文件夹。 右键点击一个build.xml文件,选择第二个“Ant构建”的运行方式..对话框。 一种用于编辑蚂蚁运行配置将打开对话框(有可能是打开这个更简单的方法)。 转到Classpath选项卡。 加入最新的JUnit在类路径(蚂蚁的lib文件夹)。



Answer 9:

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



Answer 10:

我有这个问题试图运行从运行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文件,我通过单击“添加外部JAR”按钮,添加externalJars / JUnit的-4.8.1.jar(一个我刚刚下载)到构建路径。

hamcrest.org是“匹配器”的库。 你可以找到的信息:

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

提供匹配的对象允许将声明性地定义“匹配”的规则,在其他框架中使用的库(也称为约束或谓词)。 典型的场景包括测试框架,嘲讽库和UI验证规则。

Hamcrest已被移植到Java,C ++,Objective-C的,Python和PHP的。

注:Hamcrest它不是一个测试库:它只是碰巧匹配器是用于测试非常有用的。



Answer 11:

JUnit的4.5包括Hamcrest作为其匹配系统的一部分。 你要确保你有你的类路径JAR文件太多



Answer 12:

我不认为这是需要JUnit的jar添加到Ant classpath中。 相反,检查是否有JUnit类库在Java构建路径(在Windows /首选项/的Java /构建路径/类路径变量)。



Answer 13:

好。 我终于摸索解决此问题。 我不会说“解决”,因为我仍然为这是怎么回事相当混乱。 无论如何...

我下载了最新的Ant(1.7.1)和JUnit(4.6)和爆炸他们到外部目录 - 不以任何方式“中的” Eclipse中的工作区或。

然后我去到Windows /首选项/ ANT /运行/类路径/ Ant主项,杀死所有的现有的(默认)值。 我取而代之的是新下载的Ant lib目录中的内容。

然后我加入全球条目下载的junit.jar。 它包含org.hamcrest类,就像包含Eclipse中的junit.jar,所以我不知道为什么这是必要的,但它是。

而已。 在构建文件我的junit任务完美的作品。



Answer 14:

在Eclipse中,发生这种情况,当您添加使用JUnit的罐子Properties->Libaries->Add External JARs...

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



Answer 15:

我有我的下\ lib文件夹中放置“hamcrest核心-1.3.jar”的副本解决了类似的问题。



文章来源: Ant + JUnit: NoClassDefFoundError