2

java.lang.ClassNotFoundExcpetion を与える ant build.xml ファイルに問題があります。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 変数を確認する必要があると書かれています。私はこれを行いましたが、何か間違ったことをしているに違いありません。同じビルド情報を使用して、ある os で実行され、他の os では実行されない理由がわかりません。

どんな助けでも大歓迎です

4

4 に答える 4

0
<echoproperties/>

そんな時の頼もしい味方です。Windows では問題なく動作するが、Linux では動作しない場合は、ファイル セパレーターに何らかの問題があるはずです (ただし、ant / Windows でも動作します)。または、単に現在のディレクトリが異なる (どこでも相対パスを使用する) 必要があります。 . 現在のディレクトリが異なる場合は、echopropertiesasの出力に表示され"user.dir"ます。to を設定javacするverbose="true"と、スクリプトの Windows 出力と Linux 出力を比較できます。

于 2012-11-20T21:42:48.533 に答える
0

大量の情報はありませんが、推測を危険にさらすために、junit 呼び出しのクラスパスに${lib.dir}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

私にとって、この問題は、テスト ファイルが内部クラスを使用したために発生しました。これはEclipseで別のクラスファイルとしてコンパイルされ、antがテストを実行するにはclassname.classとclassname$1.classの両方が必要になります。

于 2013-06-10T13:24:39.273 に答える