2009-01-22 95 views
23

我試圖從Hibernate 3.2升級到3.4,顯然使用slf4j。我們的項目目前使用log4j。所以我的假設是我應該使用slf4j-log4j12包裝實現。休眠3.4與slf4j和log4j

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:This blog索賠的問題是Hibernate的註解與錯誤運送引起slf4j-api.jar的版本。

+1

Hibernate 3.4?這篇文章是來自未來嗎? – cherouvim 2009-03-08 15:01:16

回答

2

在爲slf4j-log4j(然後是slf4j-parent)檢查版本1.5.6 POM後,應該使用log4j-1.2.14。 slf4j-log4j POM使用依賴關係管理從slf4j-parent POM繼承相應版本的log4j。

但是,您不應該將log4j作爲特定的依賴項,因爲它已經是slf4j-log4j的依賴項。這可能是你造成你的問題的地方。

+0

當log4j從我的pom.xml文件中刪除時,我得到了一個不同的錯誤(見上文)。 – 2009-01-22 18:09:54

12

我有

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

非常感謝,包括依賴關係是非常有幫助的。 – 2010-08-26 14:59:12

4

我認爲你需要排除內置從每個Hibernate依賴的SLF4J依賴。

我用JPA休眠,所以我的配置是不相同的,但我認爲關鍵的是明確包括所有org.hibernate作爲依賴的log4j和SLF4J和明確排除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> 
+1

這種方法對我有效,謝謝! – seanhodges 2010-03-04 09:31:50

0

我有與displaytag版本1.2包括舊的slf4j相同的問題。改變由標籤具有排除:

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

似乎來解決這個問題。