どうやらslf4jを使用しているHibernate3.2から3.4にアップグレードしようとしています。私たちのプロジェクトは現在log4jを使用しています。したがって、私の仮定は、slf4j-log4j12でラップされた実装を使用する必要があるということです。
Mavenslf4jの依存関係は次のとおりです。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
Log4jの依存関係は次のとおりです。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
Slf4j-log4j12とlog4jはどちらも、最新バージョン(Mavenリポジトリーにあります)を参照しています。アプリを実行すると、Hibernateはログに失敗します。
Java.lang.NoSuchFieldError: name
at org.slf4j.impl.Log4jLoggerAdapter.<init>(Log4jLoggerAdapter.Java:75)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.Java:75)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.Java:103)
at org.hibernate.cfg.Configuration.<clinit>(Configuration.Java:163)
...
何が足りないのですか?
編集1:pom.xmlからlog4j依存関係を削除すると、次のエラーが発生します。
Java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.Java:60)
at org.hibernate.cfg.Configuration.<clinit>(Configuration.Java:163)
...
編集2:このブログ この問題は、slf4j-api.jarの間違ったバージョンで出荷される休止状態の注釈が原因であると主張しています。
私は問題ありません
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.1.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>
そして
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<!-- concrete Log4J Implementation for SLF4J API-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
この質問には、SLF4JFAQが回答しています。参照してください
http://slf4j.org/faq.html#compatibility および http://slf4j.org/faq.html#IllegalAccessError
組み込みのSLF4J依存関係を各Hibernate依存関係から除外する必要があると思います。
私はJPAでHibernateを使用しているため、構成は同じではありませんが、重要なことは、log4jとSLF4Jを明示的に含め、すべてのorg.hibernate依存関係からslf4j-apiを明示的に除外することだと思います。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>com.Sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.Sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
<scope>runtime</scope>
</dependency>
Slf4j-log4j(およびslf4j-parent)のバージョン1.5.6 POMを確認した後、log4j-1.2.14を使用する必要があります。 slf4j-log4j POMは、依存関係管理を使用して、slf4j-parentPOMから適切なバージョンのlog4jを継承します。
ただし、log4jはすでにslf4j-log4jの依存関係であるため、特定の依存関係として含める必要はありません。それはあなたがあなたの問題を引き起こした場所だったかもしれません。
古いslf4jを含むdisplaytagバージョン1.2でも同じ問題が発生しました。表示タグを変更して除外する:
<dependency>
<groupId>displaytag</groupId>
<artifactId>displaytag</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jcl104-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
正しい依存関係を追加します。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<!-- concrete Log4J Implementation for SLF4J API-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
問題を解決したようです。
グーグル検索はこれを見つけました:
http://marc.info/?l=slf4j-user&m=122218775201271&w=2
たぶん、JARのバージョンをチェックして、互換性があることを確認する必要があります。