1

単体テストを含むプロジェクトがあります。私はMavenとm2eを使用しています。コマンドラインからMavenを使用すると、次のことがわかります。

[INFO] |  +- org.springframework:spring-test:jar:3.1.3.RELEASE:test
[INFO] |  \- junit:junit-dep:jar:4.10:test
[INFO] +- org.mockito:mockito-core:jar:1.9.0:test
[INFO] |  +- org.hamcrest:hamcrest-core:jar:1.2.1:test
[INFO] |  \- org.objenesis:objenesis:jar:1.0:test

mvn install動作し、すべてのテストが実行されます。良い。

ここで、m2e 1.2.0 を使用して Eclipse 内から単体テストを実行しようとすると、次のエラーが発生します。

java.lang.SecurityException: class "org.hamcrest.DiagnosingMatcher"'s signer information does not match signer information of other classes in the same package
        at java.lang.ClassLoader.checkCerts(ClassLoader.java:806)
        at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487)
        ...
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

それは私を困惑させます。m2e の依存関係ツリーは良さそうです。しかし、プロセスのプロパティを開くと、次の追加エントリを含む変更されたクラスパスが表示されます。

.../eclipse/3.7.2/eclipse/plugins/org.junit_4.8.2.v4_8_2_v20110321-1705/junit.jar
.../eclipse/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar

これらの JAR は署名されているため、テストは失敗します。この 2 つのエントリを削除するにはどうすればよいですか? または、それらがクラスパスの後半 (つまり、私のバージョンの JUnit + Hamcrest の後) に追加されていることを確認するにはどうすればよいですか?

4

2 に答える 2

4

回避策を見つけました。

エラーの理由は、Eclipse の JUnit ランチャーが JUnit と Hamcrest のバンドルをクラスパスに追加するためです。これら 2 つは署名済みの Orbit バンドルですが、Maven の JAR は署名されていません。

Hamcrest 1.2 には、Eclipse の Hamcrest 1.1 よりも多くのクラスが含まれています。Hamcrest 1.1 が最初にロードされた場合、Java はパッケージ内のすべてのクラスがorg.hamcrest同じ暗号署名を共有することを期待します。これは真実ではなく、それを修正する方法はありません。

「Java Build Path」または起動構成の「Classpath」タブで依存関係を手動で追加すると、エラーはなくなります。

これらの場所では、.m2/repository/(JDT JUnit ランナーが Eclipse の plugins フォルダーから JAR を追加する前に) からの JAR がクラスパスに最初に表示されるようにすることができるので、Java は Orbit からのバンドルを認識したり、ロードしようとしたりしません。

起動構成では、次のようになります。

起動構成

しかし、Eclipse がクラスパスを台無しにしない方がいいと思います :-(

于 2013-01-08T08:14:39.103 に答える
0

次の 2 つの可能性があるようです。

  1. クラスパスにはすでにjunitがあります。[プロジェクト プロパティ] -> [Java ビルド パス] の [ライブラリ] タブで、パスに複数の junit ライブラリがありますか。つまり、junit ライブラリをプロジェクトに追加しましたか。その場合は、削除してからやり直してください。

  2. より可能性の高い原因は、hamcrest 1.2 の使用です。これは JUnit 4.10 (または 4.8) と互換性がありません。JUnit 4.11 より前のバージョンには hamcrest 1.1 クラスの一部が含まれていたため、非互換性の問題が発生する可能性があります。最善の策は、4.11 にアップグレードすることです。これには、hamcrest ライブラリは含まれていませんが、推移的な依存関係として hamcrest 1.3 があります。hamcrest 1.3 を使用できる場合はそれを行い、そうでない場合は 1.2 を使用する必要があります

于 2013-01-07T20:59:28.297 に答える