Java Ant JUnit类NotFoundException

Java Ant JUnit类NotFoundException,java,ant,junit,classpath,Java,Ant,Junit,Classpath,我意识到有很多类似的问题,但是在阅读了其中的大部分之后,我似乎有相同的问题,但原因不同 我在Ant构建中运行了一个任务,得到了一个ClassNotFoundException。在大多数类似的相关问题(如上面的问题)中,这都是由于作者没有正确配置JUnit类路径造成的。虽然这对我来说很可能是一样的,但对其他任何问题的任何建议对我都不起作用 我的项目目录结构: MyProject/ src/main/java/ FakeObject.java ...the r

我意识到有很多类似的问题,但是在阅读了其中的大部分之后,我似乎有相同的问题,但原因不同

我在Ant构建中运行了一个
任务,得到了一个
ClassNotFoundException
。在大多数类似的相关问题(如上面的问题)中,这都是由于作者没有正确配置JUnit类路径造成的。虽然这对我来说很可能是一样的,但对其他任何问题的任何建议对我都不起作用

我的项目目录结构:

MyProject/
    src/main/java/
        FakeObject.java
        ...the rest of my Java main source
    src/test/java
        FakeObjectUnitTest.java
        ...the rest of my Java test source
    bin/main
        FakeObject.class
        ...the rest of main Java binaries
    bin/test
        FakeObjectUnitTest.class
        ...the rest of main Java binaries
    lib/main
        ...my main dependencies
    lib/test
        junit-4.10.jar
        hamcrest-1.1.jar
        ...the rest of my test dependencies
    gen/reports
        ...where JUnit should be placing all test reports
    build/
        build.xml
        build.properties
src/test/java/FakeObjectUnitTest.java
中:

// Package and imports omitted

public class FakeObjectUnitTest {
    @Test
    public void doSomething() {
        int x = 5;

        Assert.assertEquals(x, 5);
    }
}
我的
build.xml

<project name="" basedir="..">
    <!-- Main classpath. -->
    <path id="main.class.path">
        <fileset dir="bin/main"/>
    </path>

    <!-- Test classpath. -->
    <path id="test.class.path">
        <fileset dir="bin/test"/>
    </path>

    <!-- JUnit classpath. -->
    <path id="junit.class.path">
        <fileset dir="lib/main" includes="*.jar"/>
        <fileset dir="lib/test" includes="*.jar"/>
        <path refid="main.class.path"/>
        <path refid="test.class.path"/>
    </path>

    <!--
        All previous targets omitted for brevity (such as for compiling, etc.), but
    I assure you all that they work and compile FakeObject.java/FakeObjectUnitTest.java into
    FakeObject.class/FakeObjectUnitTest.class respectively, and place them in the correct
bin directories.
    -->

    <target name="run-junit" depends="compile">

        <property name="junit.path" refid="junit.class.path"/>
        <echo message="JUnit ClassPath is: ${junit.path}"/>

        <junit printsummary="yes" haltonerror="yes" haltonfailure="yes">
            <classpath refid="junit.class.path"/>

            <formatter type="xml"/>

            <batchtest todir="gen/reports">
                <fileset dir="src/test/java">
                    <include name="**/*UnitTest*.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>
当我在详细模式(
-v
)下运行Ant时,我看到的唯一提示是一系列警告,内容如下:

忽略异常java.util.zip.ZipException:打开zip文件读取资源x时出错

…其中
x
是类文件的名称

我发现了这个问题,问题是作者在类路径中添加了类文件,而不是JAR(这让JUnit不高兴)。因此,我尝试从
junit.class/path
中删除
main.class.path
test.class.path
,然后得到一个异常,即找不到任何类文件


对发生的事情有什么想法或想法吗?提前感谢,对于这里的
-v
问题,我表示抱歉,但我认为细节越多越好。

查看您的类路径:

...:/<path-to-my-project>/MyProject/bin/main/com/myproject/client/FakeObject.class:...
...:/<path-to-my-project>/MyProject/bin/main:...
…://MyProject/bin/main/com/MyProject/client/FakeObject.class:。。。
你不能像那样把一个单独的类放在类路径中。相反,将位于包层次结构底部的目录放在类路径中:

...:/<path-to-my-project>/MyProject/bin/main/com/myproject/client/FakeObject.class:...
...:/<path-to-my-project>/MyProject/bin/main:...
…://MyProject/bin/main:。。。

您需要用于类似于包的结构:
:

只要需要指定类似路径的值,就可以使用嵌套元素。其一般形式为:

    <classpath>
      <pathelement path="${classpath}"/>
      <pathelement location="lib/helper.jar"/>
    </classpath>

因此,您的解决方案如下所示:

<!-- JUnit classpath. -->
<path id="junit.class.path">
    <fileset dir="lib/main" includes="*.jar"/>
    <fileset dir="lib/test" includes="*.jar"/>
    <pathelement location="bin/main"/>
    <pathelement location="bin/test"/>
</path>

在运行junit目标中进行如下修改

         <batchtest todir="gen/reports">
            <fileset dir="bin/tests">
                <include name="**/*UnitTest*.class"/>
            </fileset>
         </batchtest>

谢谢@Jesper(+1)-但是如果您注意到的话,
FakeObject.class
位于JUnit类路径中的唯一原因是因为它恰好是正在编译的唯一二进制文件。它位于类路径中,因为它位于
bin/main
内部,它是
main.class.path
的一部分,而
junit.class.path
又是
junit.class.path
的一部分,所以除非我遗漏了什么,
bin/main
已经是junit类路径的一部分。