Hibernate ORM 5を組み込んだWebアプリケーションでjava.lang.NoSuchMethodErrorが発生した場合の解決方法

水曜日 , 16, 12月 2015 Leave a comment

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

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください