23

どうやら slf4j を使用している Hibernate 3.2 から 3.4 にアップグレードしようとしています。私たちのプロジェクトは現在 log4j を使用しています。したがって、slf4j-log4j12 でラップされた実装を使用する必要があると想定しています。

Maven slf4j の依存関係は次のとおりです。

<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 で出荷されている hibernate アノテーションが原因であると主張しています。

4

6 に答える 6

7

この質問は、SLF4J FAQ で回答されています。参照してください

http://slf4j.org/faq.html#compatibility および http://slf4j.org/faq.html#IllegalAccessError

于 2009-05-05T12:52:16.807 に答える
4

組み込みの 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>
于 2009-06-06T16:05:46.550 に答える
2

slf4j-log4j (および slf4j-parent) のバージョン 1.5.6 POM を確認したら、log4j-1.2.14 を使用する必要があります。slf4j-log4j POM は依存関係管理を使用して、適切なバージョンの log4j を slf4j-parent POM から継承します。

ただし、log4j は既に slf4j-log4j の依存関係であるため、特定の依存関係として含める必要はありません。それがあなたの問題を引き起こした場所かもしれません。

于 2009-01-22T04:41:37.363 に答える
0

Google検索でこれが見つかりました:

http://marc.info/?l=slf4j-user&m=122218775201271&w=2

JAR のバージョンをチェックして、互換性があることを確認する必要があるかもしれません。

于 2009-01-22T03:11:24.723 に答える
0

古いslf4jを含むdisplaytagバージョン1.2でも同じ問題がありました。除外するように displaytag を変更します。

<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>

問題を解決したようです。

于 2012-06-01T20:40:46.140 に答える