EclipseでJUnitテストを実行するとSecurityExceptionが発生する問題
EclipseでJUnitテストを実行すると、次のようなエラーが発生。
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テストも動くようになった。