【发布时间】:2015-11-20 15:24:36
【问题描述】:
我似乎无法让 Ant 运行我的 junit 测试。这是我的设置:
build.xml http://pastebin.com/c7n4cdJ6
我想做什么?我分别运行ant main 或ant package。 compile 目标编译我的代码。首先是我的 webapp 的类,然后是我的测试类:
-
javac:来源:webapp java 文件,目的地:${web.classes.dir} -
javac:来源:测试 java 文件,目的地:${web.testclasses.dir}
对于依赖管理,我使用 Apache Ivy,它运行良好。
那么让我们看看我的junit 目标。可以看到类路径是在junit.classpath 中定义的。它包含:
- 我的 Ivy 依赖于测试范围:
<path refid="test.path"/> - 我的测试编译的类文件:
<pathelement location="${web.testclasses.dir}"/> - 我的webapp编译后的class文件:
<pathelement location="${web.classes.dir}"/> - 它还包含我编译的测试类的
dirset(你看我很绝望)。
所以当我运行 ant 脚本时,它编译得很好,类文件都在那里。但是当涉及到 junit 目标并且正在执行第一个测试时,我在控制台中收到此错误:
[junit] Running CreateStopwordSqliteDBTest
[junit] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec
BUILD FAILED
在结果 xml 文件中,我得到了更多信息:
<error message="CreateStopwordSqliteDBTest (wrong name: de/mycompany/myproduct/CreateStopwordSqliteDBTest)" type="java.lang.NoClassDefFoundError">
java.lang.NoClassDefFoundError: CreateStopwordSqliteDBTest (wrong name: de/mycompany/myproduct/CreateStopwordSqliteDBTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
</error>
NoClassDefFoundError 告诉我可以在编译时找到该类,但在运行时找不到。请注意,受影响的类是实际的 JUnit 测试。为什么即使我确定它是我的 junit 类路径的一部分也找不到它?
仅供参考:当我从 build.xml(我的 junit 类路径中的 dirset)中删除第 131 - 133 行时,我会得到一个 ClassNotFoundException:
<error message="CreateStopwordSqliteDBTest" type="java.lang.ClassNotFoundException">
java.lang.ClassNotFoundException: CreateStopwordSqliteDBTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
</error>
你能帮帮我吗?
【问题讨论】: