今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

EclipseでJUnitテストを実行するとSecurityExceptionが発生する問題

EclipseJUnitテストを実行すると、次のようなエラーが発生。

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
	at java.lang.ClassLoader.checkCerts(ClassLoader.java:898)
	at java.lang.ClassLoader.preDefineClass(ClassLoader.java:668)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
(以下長いので略)

試しに他のプロジェクトでJUnitテストを動かしてみたら、問題なく動いてくれるのに、なぜこのプロジェクトだけこんなエラーが。

ぐぐってみたら、ビルドパスの設定の「順序およびエクスポート」で、JUnit4の上にhamcrest(Maven依存関係)を移動させればいいよって書いてあった。

org.hamcrest.Matchersを利用するとSecurityExceptionが発生する問題 - Qiita

楽勝で解決だ!って思って試してみたけど解決しない。
SecurityExceptionでまくりでひとつもテストをパスしない。

さらにぐぐって、StackOverflowのとあるページの最後に答えがあった。

java - hamcrest tests always fail - Stack Overflow

rename the file $ECLIPSE_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar to something like *.bak or remove the file.

ファイル名の最後に.bakを付けて試してみたら、一撃で解決。
確認のためにファイル名を戻したら再発。

ということは、maven install するたびに現象が再発する可能性が。

そのくらいはしかたないか。

と思ったら、今度は別のエラーが発生。

コンテナー 'JUnit 4' が存在しないライブラリー '/Applications/Eclipse_4.6.3.app/Contents/Eclipse/plugins/org.hamcrest.core_1.3.0.v201303031735.jar' を参照しています

ビルドできないし。。。
というか、他のプロジェクトまでビルドエラーだし。

ファイルがないとビルドエラーとなってまずいけど、hamcrestのjarはどこかにあるからテストの実行はできているわけで。

junit.jar を org.hamcrest.core_1.3.0.v201303031735.jar に上書きしてみた。いや、別にjunit.jarじゃなくてもいいんだけど。

$ cp -p /Applications/Eclipse_4.6.3.app/Contents/Eclipse/plugins/org.junit_4.12.0.v201504281640/junit.jar /Applications/Eclipse_4.6.3.app/Contents/Eclipse/plugins/org.hamcrest.core_1.3.0.v201303031735.jar

ビルドエラーも消えて、JUnitテストも動くようになった。