2009-08-01 38 views
8

ant build.xmlファイルからこの例外が発生する理由がわかりません。私はチェックし、すべてがクラスパスに入っています。なぜこれはとても複雑でなければならないのですか?antのjunitタスクで別のjava.lang.ClassNotFoundExceptionが発生する

私は過去に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を見つけて、テストを開始しようとしたが、なぜそれが私のテストクラスを見つけることができませんか?私はコンパイルされたテストクラスを持つフォルダを指します。だから私はジュニットが少なくともAntのクラスパスにいることを知っていますが、ClassNotFoundが私を困惑させます。

おそらく何ですか?どうもありがとう!

+0

ちょうど確認しています - ./build/my/package/MyTest.classを参照してください。あなたはそれが適切に構築されると確信していますか? – duffymo

+0

うん、私はコンパイルされたクラスを見ることができる、正しいディレクトリで、そこに問題なし – denchr

答えて

6

テストクラスがbuildフォルダにありますか?別のJVM(fork = true)でjunitを呼び出しているので、その呼び出し中に作業フォルダが変更され、buildが相対的である可能性があり、問題が発生する可能性があります。

詳細クラスパス/作業ディレクトリjunitが呼び出されていて、これを解決できない場合は、結果をここに返信するために、-verboseまたは-debugスイッチを使用してコマンドラインからantを実行します問題。

+0

私は夢中になるよ!私はあなたが何かにいると思う!私はスクリプトをに変更しました。 fork = noを設定する際に特に不利な点はありますか? – denchr

+0

新しいJVMが生成されます。あなたがそうする必要がある場合を除いて、あなたのテストがAntでインプロセスで実行されるように、そのままにしておきたいかもしれません。フォークを使用する場合は、作業ディレクトリを明示的に指定するために 'dir'属性を設定します。 – ChssPly76

+0

フォークは、テストで大量のメモリを使用する場合に便利です。 fork = yesの場合、forkされたJVMインスタンスに対して-Xmxを実行するmaxmemoryを設定できます。 – Spyder

2

JUnit jarをクラスパスに追加する必要はありません。 antが見つからない場合、<junit>タスクは実行されません。

私は、DOMファイルhttp://ant.apache.org/manual/using.html#pathに記載されているように、クラスパスを指定するさまざまな方法を試すことをお勧めします。具体的には<classpath path="${srcdir}" />が役に立ちます。

もしそうでなければ、コマンドラインからant -debugを実行するというChssPly76の提案が最善の策です。 antのデバッガは非常に冗長であるため、コマンドプロンプトウィンドウでバッファをバンプアップする必要があります。

+1

''はjunit.jarなしでは実行されていません。 Ant 1以降。7では 'ant-junit.jar'がAntに利用可能である限り、' 'タスクのクラスパスにjunit.jarを置くことができます。それは必ずしも最善のアプローチではないと私は同意する。 – ChssPly76

+0

これがなぜ投票されたのかわからない。オフセット+1を – ChssPly76

+0

ありがとうございます。私はAnt 1.7をあまり使用していません:) – Spyder

関連する問題