GlassFish上のWebアプリケーションでHibernate ORM 5を使おうとしたときにjava.lang.NoSuchMethodErrorが発生し、その原因を探ったときのメモ。
スタックトレースは以下のような感じで、CoreMessageLoggerクラスに問題があると表示される。
java.lang.NoSuchMethodError: org.hibernate.internal.CoreMessageLogger.debugf(Ljava/lang/String;I)V at org.hibernate.engine.jdbc.connections.internal.PooledConnections.(PooledConnections.java:42) at org.hibernate.engine.jdbc.connections.internal.PooledConnections.(PooledConnections.java:33) at org.hibernate.engine.jdbc.connections.internal.PooledConnections$Builder.build(PooledConnections.java:146) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:110) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:74) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
配布されているHibernate ORMのパッケージを見ると、問題のクラスはjboss-logging-3.X.X.Final.jarに含まれており、問題となっているメソッドもきちんと定義されている。Eclipseからもメソッドの定義箇所にジャンプできる。
ネット上の情報を調べてみると、beanvalidator conflict with Hibernate 5 / JBoss Loggingという記事が見つかる。
この記事に基づき問題のクラスを含んでいるパッケージを調べたところ、Hibernateの配布パッケージのjboss-logging-3.X.X.Final.jarに含まれるクラスとGlassFishを構成するbean-validator.jarに含まれるクラスとのあいだで競合しているのが原因のよう。
確認した範囲では、Hibernate 5.0.0〜5.0.5で問題が発生。
Hibernate ORMのバージョンを4系に戻すのが一番早い解決方法。
Please give us your valuable comment