2

我遇到了一个 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

4 回答 4

0

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

于 2013-06-10T13:24:39.273 回答
0

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

于 2012-11-20T21:34:01.183 回答
0

尝试将 junit jar 位置添加到您的类路径元素。我不知道如何,但这对我有用!

就像是,

       <classpath>
            <pathelement location="path/to/junit/jar"/>
            <pathelement location="${target.classes.java.dir}"/>
            <pathelement location="${target.classes.test.dir}"/>
        </classpath>
于 2014-05-21T07:27:45.193 回答
0
<echoproperties/>

在这种情况下,这是你最好的朋友。如果它在 Windows 上运行良好,但不能在 linux 上运行,那么文件分隔符一定有问题(但是 ant / 也适用于 Windows),或者只是你有不同的当前目录(你在任何地方都使用相对路径) . 如果您有不同的当前目录,您将在echopropertiesas的输出中看到它"user.dir"。您还可以设置javacto verbose="true",然后您可以将脚本的 windows 输出与 linux 输出进行比较。

于 2012-11-20T21:42:48.533 回答