log4j2 mit Hibernate über Maven

javandi

Mitglied
Hallo zusammen,
ich versuche als Java-Beginner eine Anwendung zu erstellen, die auf eine SQLite-Datenbank über Hibernate zugreifen soll (IDE Eclipse 2022-12).
Ich habe folgende dependecies in der pom.xml definiert:
  • Hibernate-core 6.2.6-Final
  • hibernate-annotations 3.5.6-Final
  • log4j-core 2.20.0
  • log4j-api 2.20.0
  • sqlite-dialect 0.1.4
  • sqlite-jdbc 3.42.0.0
ergibt beim Programmablauf folgende Meldung:
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

Zusätzlich folgende dependencies:
  • log4j-slf4j-impl 2.20.0
  • slf4j-simple 2.0.9
ergibt folgende Meldung:
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.

Wenn ich die zweite Meldung richtig verstehe, dann fehlt ein SLF4J-Provider. Über slf4j-simple sollte doch aber ein solcher vorhanden sein?
Was mache ich hier falsch?
Im Prinzip würde ich auch gut ohne Logger auskommen, aber wenn ich das richtig verstehe, dann kommt Hibernate nicht ohne Logger aus?

Vielen Dank schon mal für eure Tipps/Hinweise!
Javandi


PS: Ich habe versucht, die Infos hier wegen der Übersichtlichkeit auf das m. E. Notwendige zu beschränken, ggf. natürlich gerne mehr.
 

KonradN

Super-Moderator
Mitarbeiter
Kannst Du die pom bitte einmal komplett zeigen sowie wie Du die Anwendung startest wenn die Meldung kommt. Die Meldung zu slf4j mit no Providers deutet darauf hin, dass slf4j-simple nicht im classpath ist. Da wäre es auf jeden Fall hilfreich, wenn Du beschreibst, was genau Deine Schritte sind zu diesem Fehler.
 

Oneixee5

Top Contributor
Für Log4j über Slf4j brauchst du folgende Dependencies:
XML:
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>
       
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>
       
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.20.0</version>
        </dependency>
... und natürlich eine Konfiguration(sdatei) im Classpath.
 
Zuletzt bearbeitet:

javandi

Mitglied
Hallo,

vielen Dank für eure Antworten. Die vollständige pom.xml:
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.webelasoft</groupId>
  <artifactId>versuchHibernate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>de.webelasoft.versuchHibernate</name>
  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>6.2.6.Final</version>
      <type>pom</type>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-annotations</artifactId>
      <version>3.5.6-Final</version>
    </dependency>
      <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.20.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.20.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.20.0</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.github.gwenn/sqlite-dialect -->
      <dependency>
        <groupId>com.github.gwenn</groupId>
        <artifactId>sqlite-dialect</artifactId>
        <version>0.1.4</version>
      </dependency>
    <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.42.0.0</version>
    </dependency>
  </dependencies>
</project>
Nach Änderungen an der pom.xml refreshe ich im Projektexplorer und starte die main-Methode einer Testklasse über den Button (grüner Pfeil) unter der Menüleiste in Eclipse.
Eine log4j2.xml befindet sich unter src/main/resources im Projektordner.
Fehlermeldung heute Abend (mit genau dieser pom.xml):
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.

Es gibt weitere in der main-Methode, aber da die mit Hibernate zusammenhängen, denk ich, dass sie hier keine Rolle spielen.
 

KonradN

Super-Moderator
Mitarbeiter
Die Scope test bedeuten, dass die Abhängigkeiten nur beim übersetzen und laufen lassen der Tests genommen werden.

Das ist vermutlich die Erklärung, dass du bei der Ausführung keinen slf4j Provider hattest. Also einfach mal das scope test bei slf4j-simple heraus nehmen.
 

javandi

Mitglied
Bingo, genau das war es!
Ich hatte die Dinge so vom MVNRepository geholt: C & P ist doch immer wieder gefährlich.
Besten Dank, ich habe was gelernt.
 

KonradN

Super-Moderator
Mitarbeiter
Das kann so auch Sinn machen … du willst ja am Ende ein Log haben und du hast ja log4j dazu genommen ….

Dann ist das slf4j-simple nur für Unit Tests gut. Du willst ggf. genauer schauen, was @Oneixee5 in #3 geschrieben hat. Das nur als einfache Anmerkung falls du das etwas vertiefen möchtest.
 

javandi

Mitglied
Genauer schauen will ich gerne. Die Frage ist nur: Wo? Ich finde überall Bruchstücke und Vorschläge über Logging, aber bislang keine Erklärung, die nicht sofort in die allerletzte Tiefe vordringt, andererseits aber auch nicht nur an der Oberfläche kratzt. Mein Projekt dient mir nur dazu, die Dinge zu verstehen und Erfahrungen zu machen. Und da hilft die reine Übernahme von Code natürlich nicht viel weiter.
Im Gegensatz zu @Oneixee5 seinem Vorschlag läuft es bei mir ohne slf4j-api nicht. Und ohne slf4j-simple auch nicht, auch wenn ich z. Zt. noch vom Thema Unit Test etwas entfernt bin.
Ich danke dir für die Zeit, die du hier investiert hast!
 

Oneixee5

Top Contributor
Im Gegensatz zu @Oneixee5 seinem Vorschlag läuft es bei mir ohne slf4j-api nicht. Und ohne slf4j-simple auch nicht,
slf4j-api ist eine Abhängigkeit von slf4j-impl und wird von Maven automatisch eingebunden.

Dazu ein Beispiel:
1694016087263.png
/playground/pom.xml
XML:
project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>playground</groupId>
    <artifactId>playground</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
      
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.20.0</version>
        </dependency>
      
    </dependencies>
</project>

/playground/src/main/resources/log4j2.xml
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="File" fileName="output.log" bufferedIO="false"
            advertiseURI="file://output.log" advertise="true" />
    </Appenders>
    <Loggers>
        <Root level="warn">
            <AppenderRef ref="Console" />
        </Root>     
        <Logger name="playground.test" level="debug" additivity="false" >
            <AppenderRef ref="File" />
        </Logger>
    </Loggers>
</Configuration>

/playground/src/main/java/playground/Main.java
Java:
package playground;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import playground.test.Hello;

public final class Main {

    private final Logger log = LoggerFactory.getLogger(Main.class);

    public static void main(final String[] args) {
        final Main main = new Main();
        main.testLogging();
    }

    private void testLogging() {
        this.log.warn("In diese Spiel es waren zwei, drei diese Spieler waren schwach wie eine Flasche leer!");
        final Hello hello = new Hello();
        hello.testLogging();
    }

}

/playground/src/main/java/playground/test/Hello.java
Java:
package playground.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Hello {

    private final Logger log = LoggerFactory.getLogger(Hello.class);

    public void testLogging() {
        try {
            System.out.println(10 / 0);
        } catch (final Exception e) {
            this.log.error(e.getMessage(), e);
        }
    }

}

Ergebnis
Bash:
WARN StatusConsoleListener The bufferSize is set to 8192 but bufferedIo is false: false
17:55:01.706 [main] WARN  playground.Main - In diese Spiel es waren zwei, drei diese Spieler waren schwach wie eine Flasche leer!

/playground/output.log
Code:
/ by zero
java.lang.ArithmeticException: / by zero
    at playground.test.Hello.testLogging(Hello.java:12) [classes/:?]
    at playground.Main.testLogging(Main.java:20) [classes/:?]
    at playground.Main.main(Main.java:14) [classes/:?]

Deine Beschwerde ist mir ziemlich unverständlich. Du findest also die Doku, welche alles genau erklärt. Hättest du lieber eine Doku, welche nur so halb erklärt und die wichtigen Teile überspringt? Woher kann denn der Verfasser wissen was genau du gerade wissen willst? Natürlich ist es manchmal viel Text aber das gehört dazu. Wenn du nicht alles ließt, dann wirst du das Beste verpassen. Es gibt genügend Leute die über irgendetwas schimpfen und schlecht machen aber überhaupt nicht wissen wie es richtig funktioniert.
1694017017624.png
 

Anhänge

  • playground.zip
    6,3 KB · Aufrufe: 0
Zuletzt bearbeitet:

javandi

Mitglied
Hallo Oneixee5,

vielen Dank für deine ausführliche Antwort.
Eines ist aber wohl falsch angekommen: Ich beschwere mich über gar nichts! Konrad, du und viele andere stellen im Netz Infos für umsonst zur Verfügung. Ich erwarte da gar nichts und freue mich über alles was es gibt. Ich hätte mich halt nur über eine Anleitung/Tutorial gefreut, die das Thema nicht nur ganz oberflächlich erklärt, aber doch Dinge weglässt, die man als Anfänger nicht unbedingt gleich wissen muss. Hab ich zu diesem Thema nicht gefunden, ist halt so. Wenn euch so etwas bekannt gewesen wäre, hätte ich mich über eine Link gefreut. - Mehr nicht. Und natürlich muss in einer Doku alles stehen.
Bei mir war es so, dass ohne slf4j-api in der pom.xml ein Fehler kam, der verschwand, wenn ich sie explizit eingebunden habe. Wenn dort eine Abhängigkeit besteht, dann lag es wohl an irgendetwas anderem.
Ich werde mich auf jeden Fall noch mal mit deinem Post befassen und werde dann hinterher sicherlich schlauer sein. Insofern: Nochmals vielen Dank!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Maven + JPA + Eclipse + Hibernate Tools - Maven, Gradle, Ant & mehr 1
T JavaFX, Jar über Maven kreieren Tools - Maven, Gradle, Ant & mehr 2
VfL_Freak Desktopverknüpfung über den Java-Cache erstellen Tools - Maven, Gradle, Ant & mehr 0
C Subversion Übersicht über zu deployende Revisionen behalten Tools - Maven, Gradle, Ant & mehr 3
C Tomcat nicht über 8080 erreichbar Tools - Maven, Gradle, Ant & mehr 3
eskimo328 Maven Firmen Repository Dependencies nicht über Internet Tools - Maven, Gradle, Ant & mehr 7
S Webstart JNLP Update Element - kein Info-Fenster über Updates? Tools - Maven, Gradle, Ant & mehr 7
B Junit-Programm von Kommandozeile über Ant starten Tools - Maven, Gradle, Ant & mehr 20
G Maven Mit Maven Assemblieren und über Profiles eine properties-Datei manipulieren Tools - Maven, Gradle, Ant & mehr 2
K Webstart .class Datei über Reflection laden Tools - Maven, Gradle, Ant & mehr 3
S Signierte Applets über html-Link aufrufen Tools - Maven, Gradle, Ant & mehr 6
M Ant: Setzen von Umgebungsvariablen über exec-task Tools - Maven, Gradle, Ant & mehr 3
G Zugriff auf Artifactory über Ant Tools - Maven, Gradle, Ant & mehr 3
A Fehler bei Junit Tests über Ant Tools - Maven, Gradle, Ant & mehr 2
M Chat-Applet über EJB Message Bean Tools - Maven, Gradle, Ant & mehr 3
K Applet funktioniert auf Homepage bzw. über UNC-Pfad nicht Tools - Maven, Gradle, Ant & mehr 3
I Anwendung über Webstart + Libraries Tools - Maven, Gradle, Ant & mehr 8
A Ganz einfach-Applet über Browser anzeigen Tools - Maven, Gradle, Ant & mehr 3
F Bild über Applet aussuchen und auf Serverladen Tools - Maven, Gradle, Ant & mehr 14
M eine Frage über JApplet und JMenuBar Tools - Maven, Gradle, Ant & mehr 6
B Applet über Internet Explorer nicht aufrufbar Tools - Maven, Gradle, Ant & mehr 5
J Tomcat über Internet starten + Webserver Tools - Maven, Gradle, Ant & mehr 2
M clients über Java-applets auf Com-Port von server Tools - Maven, Gradle, Ant & mehr 5
F An Systeminfos rankommen über ein Applet Tools - Maven, Gradle, Ant & mehr 7
L Dateizugriff von Client auf Server über Applet Tools - Maven, Gradle, Ant & mehr 7
H Zugreifen auf Datei über ein Applet Tools - Maven, Gradle, Ant & mehr 13

Ähnliche Java Themen

Neue Themen


Oben