【发布时间】:2014-12-11 04:58:28
【问题描述】:
以前只使用过 SBT 和 Maven,我无法让 Ant 使用 Junit 测试。我在 SO 上查看了无数其他与此相关的类似问题,但无法解决。这些测试在从 Eclipse 内部运行时运行良好。失败的测试类正在抛出“NoClassDefFoundError”
我的 Ant build.xml sn-p:
<project name="APPbuild" basedir=".">
<description>APP build</description>
<property name="webinf" location="WEB-INF" />
<property name="src" location="${webinf}${file.separator}src" />
<property name="src.test" location="${webinf}${file.separator}test" />
<property name="classes" location="${webinf}${file.separator}classes" />
<property name="classes.test" location="${webinf}${file.separator}classestest" />
<property name="classes.instrument" location="${webinf}${file.separator}classesinstrument" />
<property name="dist" location="..${file.separator}dist" />
<property name="archiveFile" location="${dist}${file.separator}app.war" />
<property name="classpath" location="${webinf}${file.separator}lib" />
<property name="classpath.test" location="${webinf}${file.separator}resources${file.separator}test" />
<property name="junit.output.dir" value="${webinf}${file.separator}junit" />
<path id="libpath">
<fileset dir="${classpath}">
<include name="**${file.separator}*.jar" />
</fileset>
</path>
<path id="libpath_test">
<fileset dir="${classpath}">
<include name="**${file.separator}*.jar" />
</fileset>
<fileset dir="${classpath.test}">
<include name="**${file.separator}*.jar" />
</fileset>
</path>
<path id="test.classpath">
<pathelement location="${src}" />
<pathelement location="${src.test}" />
<pathelement location="${classes}" />
<pathelement location="${classpath}" />
<pathelement location="${classpath.test}" />
<pathelement location="${webinf}${file.separator}resources${file.separator}test${file.separator}junit-4.7.jar" />
</path>
<target name="compile" depends="init,prepare">
<javac classpathref="libpath" debug="on" srcdir="${src}" destdir="${classes}" includeantruntime="false" />
</target>
<target name="compile_test" depends="compile">
<javac classpathref="libpath_test" srcdir="${src.test}" destdir="${classes}" includeantruntime="false" />
</target>
<target name="test" depends="compile_test">
<mkdir dir="${junit.output.dir}" />
<junit fork="true" printsummary="true" showoutput="true">
<formatter type="xml" />
<classpath refid= "test.classpath" />
<batchtest todir="${junit.output.dir}">
<fileset dir="${classes}">
<include name="**/*Test.class" />
</fileset>
</batchtest>
</junit>
<echo>${classpath}</echo>
<echo>${classpath.test}</echo>
<echo>${classes}</echo>
<echo>${classes.test}</echo>
</target>
测试类之一的错误
java.lang.NoClassDefFoundError: javax/mail/Address
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.Address
at java.net.URLClassLoader$1.run(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)
另一个
java.lang.NoClassDefFoundError: org/dbunit/database/IDatabaseConnection
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.dbunit.database.IDatabaseConnection
at java.net.URLClassLoader$1.run(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)
在这一点上的任何指针或提示都会很棒。
【问题讨论】:
-
你能发布完整的错误吗?
-
我已经添加了 Junit 从 Ant 抛出的完整错误堆栈。
-
似乎您在eclipse中配置了dbunit和java-mail,但没有将其添加到ant构建的类路径中。顺便说一句,你在 ant 中不需要 ${file.separator} 。 ant 自己翻译路径。
-
汉克,谢谢。我很困惑,在我的 test.classpath refid 中,我确实定义了
其中类路径指的是所有应用程序 jar . classpath.test 引用所有的测试 jars(junit, hamcrest, etc) -
当你提到目录时,我认为它必须是
并且当它是文件时 。