【问题标题】:another java.lang.ClassNotFoundException in ant's junit taskant 的 junit 任务中的另一个 java.lang.ClassNotFoundException
【发布时间】:2014-07-16 20:39:33
【问题描述】:

我不知道为什么我会从我的 ant build.xml 文件中得到这个异常。我检查了一下,一切都在类路径中。为什么要这么复杂?!

我过去在使用 Ant 时遇到过问题,似乎它总是与类路径有关。我使用两种方式指向 junit.jar:在 eclipse 中:window->preferences->ant->runtime->Ant Home->Add External Jars,以及在 build.xml 脚本中。这次 Ant 无法在 junit 任务中找到我的测试类。我指向这个类的方式有问题吗?

<target name="init">
    <property name="sourceDir" value="src"/>
    <property name="outputDir" value="build" />
    <property name="junitLocation" value="C:\...\org.junit4_4.3.1\junit.jar" /> 
</target>

<target name="clean" depends="init">
    <delete dir="${outputDir}" />
</target>

<target name="prepare" depends="clean">
    <mkdir dir="${outputDir}" />
</target>

<target name="compile" depends="prepare">
     <javac srcdir="${sourceDir}" destdir="${outputDir}" classpath="${junitLocation}"/>
</target>

<path id="classpath">
   <pathelement location="${outputDir}" />
   <pathelement location="${junitLocation}" />
</path>

<target name="testApplication" depends="compile">
    <echo>Running the junit tests...</echo>
    <junit fork="yes" haltonfailure="yes">
        <test name="my.package.MyTest" />
        <formatter type="plain" usefile="false" />      
        <classpath refid="classpath" />
    </junit>
</target>

我总是得到:

    [junit] Testsuite: my.package.MyTest
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
    [junit]     Caused an ERROR
    [junit] my.package.MyTest
    [junit] java.lang.ClassNotFoundException: my.package.MyTest
    [junit]     at java.net.URLClassLoader$1.run(Unknown Source)
    [junit]     at java.security.AccessController.doPrivileged(Native Method)
    [junit]     at java.net.URLClassLoader.findClass(Unknown Source)
    [junit]     at java.lang.ClassLoader.loadClass(Unknown Source)
    [junit]     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    [junit]     at java.lang.ClassLoader.loadClass(Unknown Source)
    [junit]     at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    [junit]     at java.lang.Class.forName0(Native Method)
    [junit]     at java.lang.Class.forName(Unknown Source)

BUILD FAILED

显然,Ant 找到了 junit.jar 并尝试开始测试,但为什么找不到我的测试类?我指向带有已编译测试类的文件夹。所以我知道 junit 至少在 Ant 的类路径上,但是 ClassNotFound 让我很困惑。

有什么想法吗?非常感谢!

【问题讨论】:

  • 只是检查 - 你看到 ./build/my/package/MyTest.class 了吗?你确定它可以正常构建吗?
  • 是的,我可以看到编译好的类,在正确的目录下,没有问题

标签: java ant junit


【解决方案1】:

您确定您的测试类在build 文件夹中吗?您在单独的 JVM (fork=true) 中调用 junit,因此在该调用期间工作文件夹可能会发生变化,并且 build 是相对的,这可能会导致问题。

使用 -verbose 或 -debug 开关从命令行(不是从 Eclipse)运行 ant 以查看详细的类路径/工作目录 junit 正在被调用,如果仍然无法解决,请在此处发布结果这个问题。

【讨论】:

  • 我会很危险的!我认为你在做某事!我将脚本更改为 并且成功了!设置 fork=no 有什么特别的缺点吗?
  • 它产生了一个新的 JVM。除非您需要这样做,否则您可能只想将其关闭,以便您的测试在 ant 进程中运行。或者,如果您确实使用 fork,请设置 'dir' 属性以明确指定您的工作文件夹。
  • 如果您的测试使用大量内存,则分叉很有用;当 fork=yes 时,您可以设置在分叉的 JVM 实例上执行 -Xmx 的 maxmemory。
  • 非常感谢!我确实使用 -verbose 运行了 ant(来自 eclipse 中)。确认使用 fork=yes,junit 失败。但是使用 fork=no,它工作得很好。我应该在 ant 详细输出中寻找什么?我只关注 [junit] 任务输出的内容,因此一个好的起点可能是类路径语句
  • 如果您确实需要将 fork 设置为 yes,请将 dir 设置为您的“根”文件夹(例如 build 的父文件夹)。那应该行得通。详情在这里:ant.apache.org/manual/OptionalTasks/junit.html
【解决方案2】:

您不需要将 JUnit jar 添加到类路径中。如果 ant 找不到,&lt;junit&gt; 任务将不会运行。

我建议尝试不同的方法来指定类路径,如 http://ant.apache.org/manual/using.html#path 的 ant 文档中所述;特别是&lt;classpath path="${srcdir}" /&gt; 可能会有所帮助。

如果没有,ChssPly76 建议从命令行运行 ant -debug 是最好的选择。不过,您需要在命令提示符窗口中增加缓冲区,因为 ant 的调试器非常冗长。

【讨论】:

  • 你错了&lt;junit&gt;没有junit.jar就不能运行。从 Ant 1.7 开始,只要 Ant 可以使用 ant-junit.jar,就可以将 junit.jar 放在 &lt;junit&gt; 任务的类路径中。也就是说,我同意这不一定是最好的方法
  • 谢谢。我不怎么用 Ant 1.7 :)
  • 你应该删除这个答案,这是错误的。您可以为 ant 提供您自己的 junit 副本的路径。
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2012-04-04
  • 2010-11-22
相关资源
最近更新 更多