Ant和Junit测试java.lang.ClassNotFoundException

时间:2012-11-20 21:26:43

标签: java linux ant junit

我遇到了一个ant build.xml文件的问题,该文件给了我一个java.lang.ClassNotFoundExcpetion。我可以在Windows上运行它,但是当我将它移植到Linux vm时,我得到了异常。

<project name="OBJECT" default="compile" >
<!--
Properties for the directories of .java
These are the locations the the source files
These are the locations of the .jar dependancy
 -->
<property name="src.dir" location="src"/>
<property name="src.java.dir" location="${src.dir}/csc439"/>
<property name="src.test.dir" location="${src.dir}/test"/>
<property name="lib.dir" location="lib"/>

<!--
Properties for the directories of .class
This gets deleted when ant clean is run
 -->
<property name="target.dir" location="target"/>
<property name="target.classes.java.dir" location="${target.dir}/classes/java"/>
<property name="target.classes.test.dir" location="${target.dir}/classes/test"/>

<!--Properties for the report directory-->
<property name="target.report.dir" location="${target.dir}/report"/>
<!-- 
compile.java 
Creates a directory for the .class files of the Java files for the file being tested
Compiles the files and places the .class into the java file created
Imports the necissary .jar files from the lib directory
-->
<target name="compile.java">
        <mkdir dir="${target.classes.java.dir}"/>
        <javac includeantruntime="true" destdir="${target.classes.java.dir}">
            <src path="${src.java.dir}"/> 
            <classpath> 
                <pathelement location="${target.classes.java.dir}"/>
                    <pathelement location="${lib.dir}"/>
                <fileset dir="${lib.dir}"> 
                    <include name="*.jar"/>
                </fileset> 
            </classpath> 
        </javac>
    </target>
<!-- 
compile.test 
Depends on compile.java to complete first
Creates a directory for the .class files of the Test files
Compiles the files and places the .class into the test file created
-->
<target name="compile.test" depends="compile.java">
    <mkdir dir="${target.classes.test.dir}"/>
    <javac includeantruntime="true" destdir="${target.classes.test.dir}">
        <src path="${src.test.dir}"/>
        <classpath>
            <pathelement location="${target.classes.java.dir}"/>
                <pathelement location="${lib.dir}"/>
            <fileset dir="${lib.dir}"> 
                <include name="*.jar"/>
            </fileset> 
        </classpath>
    </javac>
</target>
<!-- 
compile
This the the default
Depends on compile.java, and compile.test
-->
<target name="compile" depends="compile.java,compile.test"/>
<!-- 
test
Depends on compile
Creates the report file
Runs the JUnit test TestCacheSuite in the test file in the test .class directory
--> 
<target name="test" depends="compile">
    <mkdir dir="${target.report.dir}"/>
    <junit printsummary="yes" haltonerror="yes" haltonfailure="yes" fork="yes">
        <formatter type="plain" usefile="false"/>
            <formatter type="xml"/>
        <test name="test.TestMediaPlayer" todir="${target.report.dir}"/>
        <classpath>
            <pathelement location="${target.classes.java.dir}"/>
            <pathelement location="${target.classes.test.dir}"/>
        </classpath>
    </junit>
</target>   
<!-- 
report
Depends on test
Creates the file for html documents
Depends on Test
Creates a Junit report 
--> 
<target name="report" depends="test">
    <mkdir dir="${target.report.dir}/html"/>
    <junitreport todir="${target.report.dir}">
        <fileset dir="${target.report.dir}">
            <include name="TEST-*.xml"/>
        </fileset>
        <report todir="${target.report.dir}/html"/>
    </junitreport>
</target>
<!--
clean
Deletes the target directory
This file contains all of the .class files
This file contains all of the reports
-->
<target name = "clean">
    <delete dir = "${target.dir}"/>
</target>

这是我在linux上运行时遇到的错误。

    [junit] Running test.MockObject
[junit] Testsuite: test.MockObject
[junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
[junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
[junit]
[junit]     Caused an ERROR
[junit] test.MockObject
[junit] java.lang.ClassNotFoundException: test.MockObject
[junit]     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
[junit]     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
[junit]     at java.security.AccessController.doPrivileged(Native Method)
[junit]     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
[junit]     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
[junit]     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
[junit]     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
[junit]     at java.lang.Class.forName0(Native Method)
[junit]     at java.lang.Class.forName(Class.java:264)
[junit]

使用完全相同的构建文件,我可以在Windows上正常运行。

我在Windows上从命令行运行它很好,并且使用Eclipse都可以完美地工作。

从我阅读的所有内容中我都需要检查CLASSPATH和PATH变量。 我这样做了,但我一定做错了。我不明白为什么使用相同的构建信息,它将在一个操作系统中运行,而不是另一个操作系统。

非常感谢任何帮助

4 个答案:

答案 0 :(得分:0)

没有大量的信息可以继续,但为了猜测,我要说你需要在你的junit调用的类路径中添加${lib.dir}作为<pathelement>

答案 1 :(得分:0)

<echoproperties/>

在这种情况下,这是你最好的朋友。如果它在Windows上运行良好,但不能在linux上运行,那么它必须是文件分隔符的一些问题(但是使用ant /在Windows上工作),或者只是你有不同的当前目录(你在任何地方使用相对路径) 。如果您有不同的当前目录,则会在echoproperties的输出中将其显示为"user.dir"。您也可以将javac设置为verbose="true",然后您可以将脚本的Windows输出与linux输出进行比较。

答案 2 :(得分:0)

对我来说,这个问题出现了,因为我的测试文件使用了内部类。这是在eclipse中编译为一个单独的类文件,你需要classname.class和classname $ 1.class来运行你的测试。

答案 3 :(得分:0)

尝试将junit jar位置添加到classpath元素中。我不知道怎么做但对我有用!

类似的东西,

       <classpath>
            <pathelement location="path/to/junit/jar"/>
            <pathelement location="${target.classes.java.dir}"/>
            <pathelement location="${target.classes.test.dir}"/>
        </classpath>