web-dev-qa-db-ja.com

Ant + JUnit:NoClassDefFoundError

わかりました、イライラしました!私はかなりの時間を探し回りましたが、それでも困惑しています。

環境:WinXP、Eclipse Galileo 3.5(直接インストール-追加のプラグインなし)。

だから、私は簡単なJUnitテストを持っています。内部のEclipse JUnit実行構成から問題なく実行されます。このクラスは何にも依存していません。この問題を可能な限り絞り込むために、次の内容が含まれています。

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}

これまでのところ汗はありません。ここで、Ant内からこのテストケースを実行するという非常に高度な手順を実行します(最終的な目標はHudsonとの統合です)。

それで、私はbuild.xmlを作成します:

<project name="Test" default="basic">
    <property name="default.target.dir" value="${basedir}/target" />
    <property name="test.report.dir" value="${default.target.dir}/test-reports" />

    <target name="basic">
        <mkdir dir="${test.report.dir}" />
        <junit fork="true" printSummary="true" showOutput="true">
            <formatter type="plain" />
            <classpath>
                <pathelement path="${basedir}/bin "/>
            </classpath>
            <batchtest fork="true" todir="${test.report.dir}" >
                <fileset dir="${basedir}/bin">
                    <include name="**/*Test.*" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

$ {basedir}は、ソース、クラス、ビルドファイルを含むワークスペース内のJavaプロジェクト名です。すべての.Javaとbuild.xmlは$ {basedir}/srcにあります。クラスファイルは$ {basedir}/binにあります。

私はEclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jarをWindows/Preferences/Ant/Runtime/Contributed Entriesを介してAntランタイムクラスパスに追加しました。 ant-junit.jarはAntホームエントリにあります。

では、このめちゃくちゃ複雑なターゲットを実行するとどうなりますか?レポートファイルに含まれるもの:

Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
Java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClass(Unknown Source)
    at Java.security.SecureClassLoader.defineClass(Unknown Source)
    at Java.net.URLClassLoader.defineClass(Unknown Source)
    at Java.net.URLClassLoader.access$000(Unknown Source)
    at Java.net.URLClassLoader$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    Caused by: Java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at Java.net.URLClassLoader$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClassInternal(Unknown Source)

このorg.hamcrest.SelfDescribingクラスとは何ですか?モックとは何か?いいよ。しかし、なぜ依存関係なのか?私はそれで何もしていません。これは文字通りJavaプロジェクトであり、JUnit以外の依存関係はありません。

困惑(そしてイライラ)!

26
SteveT

JUnit 4.7をダウンロードし、junit-4.7.jarを(古いバージョンではなく)ビルドパスに配置しました。それで解決しました。アリには触れなかった。

14
JB

テスト用クラスパスにhamcrest.jarも追加します

10
dfa

同じ問題の理由を見つけましたが、コマンドラインでAntを使用してテストを実行した場合のみです。

Antをデバッグモード(ant -d)このステートメントに注意してください:

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...

私の場合、このJARはテストの実行時にクラスパスの最後に追加され、AntスクリプトのJUnit参照を上書きしました。

私のAntインストールには、一連の古いJUnitライブラリがバンドルされていることがわかりました。 Antクラスパスを有効にするために、上記のjunit4.jarを削除する必要がありました。

7
PålOliver

Eclipseでまったく同じ問題に直面しましたが、所定の手順に従って解決しました

  1. [設定]に移動します| Java | JUnit
  2. 「パッケージの追加」をクリックし、「org.hamcrest。*」を追加します

出来上がり...問題は解消しました。

3
Niranjan

JUnit 4.11、Ant、Ivyでも同じ問題が発生しました。このコードは私にとっては機能しますが、libフォルダーにhamcrest-core-1.3.jar(jUnit 4.11の場合)があることを確認する必要があります。

<property name="lib.dir">lib</property>
<property name="test.dir">src/test/Java</property>
<property name="build.test">build/test/Java</property>

<path id="test.path.id">
    <path location="${build.test}" />
    <path refid="lib.path.id" />
</path>

<path id="lib.path.id">
    <fileset dir="${lib.dir}" />
</path>

<!-- ================================= 
              Runs Tests         
================================= -->
<target name="junit">
    <junit>
        <classpath refid="test.path.id" />
        <batchtest>
            <fileset dir="${test.dir}" />
        </batchtest>
        <formatter type="plain" usefile="false" />
    </junit>
</target>
2

私は同じ問題を抱えており、クラスパスを変更するために多くの方法を試しました。私にとって最も簡単な解決策は、junitターゲットでパラメーターfork = "no"を使用することでした。 Eclipseは私よりも「自動的に」それをうまくできるようです...

2
Bananeweizen

私はhamcrestとjunit jarファイルをJava/lib/extディレクトリに追加しましたが、それでうまくいきました。

2
Dilip

欠落しているクラスは、バージョン4.4以降のjunitに含まれています( link )。

古いバージョンのjUnitがクラスパスにあるかどうかを確認してください。コマンドシェルでAntスクリプトを実行して、同じエラーが発生するかどうかを確認してください。もしそうなら、おそらくantは4.4より古いjUnitバージョンを使用しています

更新:

ANT_HOMEフォルダーを確認します。 build.xmlファイルを右クリックし、「実行」ダイアログで2番目の「Antビルド」を選択します。 Ant実行構成を編集するためのダイアログが開きます(これを開く簡単な方法があるかもしれません)。 [クラスパス]タブに移動します。最新のjunitをクラスパス(antのlibフォルダー)に追加します。

1
kgiannakakis

トップレベルからEclipseのインストールディレクトリを検索して、「hamcrest。jar」を探しました(hamcrestの周りのワイルドカード '*'がこのWeb投稿に表示されていません)。次に、見つかったjarファイルをAnt build.xmlのクラスパスに追加しました。修繕。

1
Rolf

Run-> Run As-> JUnit Testからjunitテストを実行しようとしたときにこの問題が発生しました(チェックしたところ、最新のjunitプラグイン(junit4_4.5.0)がインストールされています)。

Eclipseインストールのメインディレクトリに新しいディレクトリ(externalJars)を作成し、そこに最新のjunit jar(4.8.1)をダウンロードしました。

次に、Eclipseから、プロジェクトを選択して、ビルドパス(プロジェクト->プロパティ-> Javaビルドパス)のjarファイルを変更しました。最初にjunitを試したときに、 plugin/org.junit4_4.5.0.v20090824フォルダーからのjunit jarファイル。このjarファイルを削除して、externalJars/junit-4.8.1.jar(ダウンロードしたばかりのファイル)をビルドパスに追加しました。外部ジャーを追加」ボタンをクリックします。

hamcrest.orgは「マッチャー」のライブラリです。あなたは情報を見つけることができます:

http://code.google.com/p/hamcrest/

マッチャーオブジェクト(制約または述語とも呼ばれます)のライブラリーを提供し、「一致」ルールを宣言的に定義して、他のフレームワークで使用できるようにします。典型的なシナリオには、テストフレームワーク、モックライブラリ、UI検証ルールが含まれます。

Hamcrestは、Java、C++、Objective-C、PythonおよびPhPに移植されています。

注:Hamcrestはテストライブラリではありません。マッチャーがテストに非常に役立つということが起こります。

1
Jay Elston

OK。ようやくこの問題を回避しました。何が起こっているのかまだまだ混乱しているので、「解決済み」とは言いません。とにかく...

最新のAnt(1.7.1)とJUnit(4.6)をダウンロードして、ワークスペースやEclipse内ではなく、外部ディレクトリに展開しました。

次に、Windows/Preferences/Ant/Runtime/Classpath/Ant Home Entriesに移動して、既存の(デフォルト)値をすべて削除します。新しくダウンロードしたAnt libディレクトリの内容に置き換えました。

次に、ダウンロードしたjunit.jarをGlobal Entriesに追加しました。 Eclipseに含まれているjunit.jarと同じように、org.hamcrestクラスが含まれているため、これが必要な理由はわかりませんが、必要です。

それでおしまい。ビルドファイルのjunitタスクは完全に機能します。

0
SteveT

JUnit 4.5には、マッチングシステムの一部としてHamcrestが含まれています。クラスパスにもそのJARファイルがあることを確認する必要があります。

0
tddmonkey

同様の問題があり、\ libフォルダーに "hamcrest-core-1.3.jar"のコピーを配置することで解決しました。

0
Venkat Rao

Eclipseでは、これはProperties->Libaries->Add External JARs...を使用してjunit jarを追加すると発生します

Properties->Libaries->Add Library...を使用する代わりに、Junit3 or Junit4およびhamcrestライブラリを自動的に追加をパスに選択できます。

0
Iñaqui

JUnit jarをAntクラスパスに追加する必要があるとは思いません。代わりに、Javaビルドパス(Windows/Preferences/Java/Build Path/Classpath Variables)にJUnitライブラリがあることを確認してください。

0
akf