【问题标题】:Ant throws NoClassDefFoundError when executing running Junit Target, runs fine in EclipseAnt 在执行运行 Junit Target 时抛出 NoClassDefFoundError,在 Eclipse 中运行良好
【发布时间】: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)
  • 当你提到目录时,我认为它必须是 并且当它是文件时

标签: java eclipse ant junit


【解决方案1】:

汉克关于路径元素/位置的提示使我发现以下方法有效。

将 test.classpatch id 更改为以下内容现在可以获取所有必要的应用程序和测试库。

<path id="test.classpath">
    <pathelement location="${classes}" />
    <fileset dir="${classpath}" includes="**/*.jar"/>
    <fileset dir="${classpath.test}" includes="**/*.jar"/>
</path>

非常感谢汉克!

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 2015-10-06
    • 2011-04-17
    • 2018-02-19
    • 2011-06-18
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多