2009-01-22 13 views
23

Ich versuche ein Upgrade von Hibernate 3.2 auf 3.4, die offenbar Slf4j verwendet. Unser Projekt verwendet derzeit log4j. Also meine Annahme ist, dass ich die Slf4j-Log4j12 Wrapped-Implementierung verwenden sollte.Hibernate 3.4 mit slf4j und log4j

Die Maven slf4j Abhängigkeit ist:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.5.6</version> 
</dependency> 

Während die log4j Abhängigkeit ist:

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
</dependency> 

Sowohl slf4j-log4j12 und log4j verweisen auf die neueste Version (die ich im Maven Repository finden konnte) . Wenn ich meine App starte, schlägt Hibernate bei der Protokollierung fehl:

Was fehlt mir?

Edit 1: Wenn ich die log4j Abhängigkeit von meinem pom.xml entfernen erhalte ich die Fehlermeldung:

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

Edit 2:This blog Ansprüche das Problem durch Hibernate Annotations verursacht wird, mit dem falschen Versand Version von slf4j-api.jar.

+1

Hibernate 3.4? Kommt dieser Post aus der Zukunft? – cherouvim

Antwort

2

Nachdem Sie die Version 1.5.6 POM für slf4j-log4j (und dann slf4j-parent) überprüft haben, sollten Sie log4j-1.2.14 verwenden. Das slf4j-log4j-POM verwendet das Abhängigkeitsmanagement, um die entsprechende Version von log4j vom slf4j-übergeordneten POM zu erben.

Sie sollten log4j jedoch nicht als spezifische Abhängigkeit angeben, da es bereits eine Abhängigkeit von slf4j-log4j ist. Vielleicht haben Sie dort Ihr Problem verursacht.

+0

Ich erhalte einen anderen Fehler (siehe oben), wenn log4j aus meiner pom.xml-Datei entfernt wird. –

12

Ich habe keine Probleme mit

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

und

 <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

Vielen Dank, einschließlich der Abhängigkeiten ist sehr hilfreich. –

4

Ich glaube, Sie ausschließen müssen die eingebaute in SLF4J Abhängigkeit von jedem der Hibernate Abhängigkeiten.

ich mit JPA Hibernate, so mein Config nicht identisch ist, aber ich denke, das Entscheidende ist, explizit einschließen log4j und SLF4J und explizit slf4j-api aus allen org.hibernate Abhängigkeiten ausschließen:

<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

Dieser Ansatz hat für mich funktioniert, danke! – seanhodges

0

Ich hatte das gleiche Problem mit Displaytag Version 1.2 einschließlich alten Slf4j.Ändern des displaytag den Ausschluss haben:

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

und das Hinzufügen der richtigen Abhängigkeiten:

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

schien das Problem zu beheben.

Verwandte Themen