NoClassDefFoundError: org/slf4j/LoggerFactory bei Ausführung in Intellij, funktioniert aber über die Befehlszeile einwanJava

Java-Forum
Anonymous
 NoClassDefFoundError: org/slf4j/LoggerFactory bei Ausführung in Intellij, funktioniert aber über die Befehlszeile einwan

Post by Anonymous »

Ich habe Probleme im Zusammenhang mit meinen Tests, die fehlschlagen, weil slf4j-api nicht vorhanden ist. Dies macht keinen Sinn, da es vorhanden ist, da es als transitive Abhängigkeit von einer der Bibliotheken bereitgestellt wird.
Der Fehler ist:

Code: Select all

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

at nl.altindag.log.util.LogbackUtils.getSlf4jLogger(LogbackUtils.java:66)
at nl.altindag.log.util.LogbackUtils.getLogger(LogbackUtils.java:52)
at nl.altindag.log.LogCaptor.(LogCaptor.java:56)
at nl.altindag.log.LogCaptor.forName(LogCaptor.java:91)
at [email protected]/nl.altindag.ssl.keymanager.KeyManagerFactoryWrapperShould.(KeyManagerFactoryWrapperShould.java:41)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.util.Optional.orElseGet(Optional.java:369)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 9 more
Was darauf hinweist, dass die slf4j-api fehlt. Der MVN-Abhängigkeitsbaum sollte jedoch mehr Einblick in das geben, was vorhanden ist.

Code: Select all

[INFO] --- dependency:3.7.0:tree (default-cli) @ ayza ---
[INFO] io.github.hakky54:ayza:jar:10.0.1-SNAPSHOT
[INFO] +- io.github.hakky54:yaslf4j:jar:1.0.5:compile
[INFO] +- org.junit.jupiter:junit-jupiter-api:jar:5.14.0:test
[INFO] |  +- org.opentest4j:opentest4j:jar:1.3.0:test
[INFO] |  +- org.junit.platform:junit-platform-commons:jar:1.14.0:test
[INFO] |  \- org.apiguardian:apiguardian-api:jar:1.1.2:test
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.14.0:test
[INFO] |  \- org.junit.platform:junit-platform-engine:jar:1.14.0:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:5.11.0:test
[INFO] |  \- org.mockito:mockito-core:jar:5.11.0:test
[INFO] |     +- net.bytebuddy:byte-buddy-agent:jar:1.17.8:test
[INFO] |     \- org.objenesis:objenesis:jar:3.3:test
[INFO] +- org.assertj:assertj-core:jar:3.27.6:test
[INFO] |  \- net.bytebuddy:byte-buddy:jar:1.17.8:test
[INFO] +- io.github.hakky54:logcaptor:jar:2.12.1:test
[INFO] |  +- ch.qos.logback:logback-classic:jar:1.3.15:test
[INFO] |  |  \- ch.qos.logback:logback-core:jar:1.3.15:test
[INFO] |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.25.1:test
[INFO] |  |  \- org.apache.logging.log4j:log4j-api:jar:2.25.1:test
[INFO] |  \- org.slf4j:jul-to-slf4j:jar:2.0.17:test
[INFO] +- io.github.hakky54:ssl-server:jar:1.0.8:test
[INFO] |  +- io.netty:netty-codec-http:jar:4.2.4.Final:test
[INFO] |  |  +- io.netty:netty-common:jar:4.2.4.Final:test
[INFO] |  |  +- io.netty:netty-buffer:jar:4.2.4.Final:test
[INFO] |  |  +- io.netty:netty-transport:jar:4.2.4.Final:test
[INFO] |  |  |  \- io.netty:netty-resolver:jar:4.2.4.Final:test
[INFO] |  |  +- io.netty:netty-codec-base:jar:4.2.4.Final:test
[INFO] |  |  +- io.netty:netty-codec-compression:jar:4.2.4.Final:test
[INFO] |  |  \- io.netty:netty-handler:jar:4.2.4.Final:test
[INFO] |  |     \- io.netty:netty-transport-native-unix-common:jar:4.2.4.Final:test
[INFO] |  \- org.bouncycastle:bcpkix-jdk18on:jar:1.82:test
[INFO] |     \- org.bouncycastle:bcutil-jdk18on:jar:1.82:test
[INFO] |        \- org.bouncycastle:bcprov-jdk18on:jar:1.82:test
[INFO] \- org.java-websocket:Java-WebSocket:jar:1.6.0:test
[INFO]    \- org.slf4j:slf4j-api:jar:2.0.13:test
slf4j-api wird als transitive Abhängigkeit über ch.qos.logback:logback-core bereitgestellt, das von io.github.hakky54:logcaptor und org.java-websocket:Java-WebSocket stammt, die beide als testbezogene Abhängigkeiten markiert sind.
Wenn ich mvn dependency:list ausführe Es zeigt auch korrekt an, dass slf4j-api vorhanden ist, siehe hier:

Code: Select all

[INFO] The following files have been resolved:
[INFO]    io.github.hakky54:yaslf4j:jar:1.0.5:compile -- module nl.altindag.yaslf4j
[INFO]    org.junit.jupiter:junit-jupiter-api:jar:5.14.0:test -- module org.junit.jupiter.api
[INFO]    org.opentest4j:opentest4j:jar:1.3.0:test -- module org.opentest4j
[INFO]    org.junit.platform:junit-platform-commons:jar:1.14.0:test -- module org.junit.platform.commons
[INFO]    org.apiguardian:apiguardian-api:jar:1.1.2:test -- module org.apiguardian.api
[INFO]    org.junit.jupiter:junit-jupiter-engine:jar:5.14.0:test -- module org.junit.jupiter.engine
[INFO]    org.junit.platform:junit-platform-engine:jar:1.14.0:test -- module org.junit.platform.engine
[INFO]    org.mockito:mockito-junit-jupiter:jar:5.11.0:test -- module org.mockito.junit.jupiter [auto]
[INFO]    org.mockito:mockito-core:jar:5.11.0:test -- module org.mockito [auto]
[INFO]    net.bytebuddy:byte-buddy-agent:jar:1.17.8:test -- module net.bytebuddy.agent
[INFO]    org.objenesis:objenesis:jar:3.3:test -- module org.objenesis [auto]
[INFO]    org.assertj:assertj-core:jar:3.27.6:test -- module org.assertj.core
[INFO]    net.bytebuddy:byte-buddy:jar:1.17.8:test -- module net.bytebuddy
[INFO]    io.github.hakky54:logcaptor:jar:2.12.1:test -- module nl.altindag.logcaptor
[INFO]    ch.qos.logback:logback-classic:jar:1.3.15:test -- module ch.qos.logback.classic
[INFO]    ch.qos.logback:logback-core:jar:1.3.15:test -- module ch.qos.logback.core
[INFO]    org.apache.logging.log4j:log4j-to-slf4j:jar:2.25.1:test -- module org.apache.logging.log4j.to.slf4j
[INFO]    org.apache.logging.log4j:log4j-api:jar:2.25.1:test -- module org.apache.logging.log4j
[INFO]    org.slf4j:jul-to-slf4j:jar:2.0.17:test -- module jul.to.slf4j
[INFO]    io.github.hakky54:ssl-server:jar:1.0.8:test -- module nl.altindag.ssl.server
[INFO]    io.netty:netty-codec-http:jar:4.2.4.Final:test -- module io.netty.codec.http
[INFO]    io.netty:netty-common:jar:4.2.4.Final:test -- module io.netty.common
[INFO]    io.netty:netty-buffer:jar:4.2.4.Final:test -- module io.netty.buffer
[INFO]    io.netty:netty-transport:jar:4.2.4.Final:test -- module io.netty.transport
[INFO]    io.netty:netty-resolver:jar:4.2.4.Final:test -- module io.netty.resolver
[INFO]    io.netty:netty-codec-base:jar:4.2.4.Final:test -- module io.netty.codec
[INFO]    io.netty:netty-codec-compression:jar:4.2.4.Final:test -- module io.netty.codec.compression
[INFO]    io.netty:netty-handler:jar:4.2.4.Final:test -- module io.netty.handler
[INFO]    io.netty:netty-transport-native-unix-common:jar:4.2.4.Final:test -- module io.netty.transport.unix.common
[INFO]    org.bouncycastle:bcpkix-jdk18on:jar:1.82:test -- module org.bouncycastle.pkix
[INFO]    org.bouncycastle:bcutil-jdk18on:jar:1.82:test -- module org.bouncycastle.util
[INFO]    org.bouncycastle:bcprov-jdk18on:jar:1.82:test -- module org.bouncycastle.provider
[INFO]    org.java-websocket:Java-WebSocket:jar:1.6.0:test -- module org.java_websocket
[INFO]    org.slf4j:slf4j-api:jar:2.0.13:test -- module org.slf4j
Ich verwende yaslf4j als Protokollierungs-API. Das versucht, sich bei der SLF4J-API zu protokollieren, greift auf die Log4j2-API zurück und wenn auch diese nicht vorhanden ist, greift es auf die Java-Util-Protokollierung zurück. Ich verwende diese benutzerdefinierte Protokollierungs-API, sodass ich meinen Endbenutzer nicht dazu zwinge, slf4j zu verwenden. Wenn er jedoch slf4j verwendet, werden die Protokolle an slf4j umgeleitet. Und das Gleiche gilt für log4j2. Und einige Endbenutzer bevorzugen die Verwendung einer Protokollierungs-API überhaupt nicht und protokollieren sie in diesem Fall im Java Util Logger. Der POM von yaslf4j hat slf4j als bereitgestellten Bereich deklariert, sodass er für niemanden, der ihn verwenden wird, als transitive Abhängigkeit einbezogen wird. Die ayza-Bibliothek, in der das Problem auftritt, protokolliert jetzt während der Tests bei yaslf4j. Die Sfl4j-API ist während der Tests vorhanden, sodass yaslf4j sie an die Slf4j-API weiterleitet. Ich verwende log-captor, um diese Protokolle zu erfassen, damit ich eine Assertion darauf durchführen kann. Der Logger kann jedoch nicht erstellt werden, da er lautet: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
Das Seltsame daran ist, dass es funktioniert, wenn ich mvn clean install vom Terminal aus ausführe. Wenn ich den Test von Intellij aus ausführe, wie unten gezeigt, schlägt er fehl
Image

Wie reproduziere ich?
  • Git-Klon ausführen https://github.com/Hakky54/ayza.git
  • Führen Sie Git Switch Feature/make-slf4j-logger-optional aus
  • Stellen Sie sicher, dass Java 11 oder höher konfiguriert ist
  • Führen Sie MVN Clean Install aus
Analysieren Sie das Build-Ergebnis, da es zeigt, dass es erfolgreich erstellt wurde.
  • Projekt aus Intellij IDEA öffnen
  • Test im Explorer ausführen, wie im Screenshot oben gezeigt
Der Test schlägt fehl
Wenn ich mir den Maven-Abhängigkeitsbaum, die Maven-Abhängigkeitsliste und die Abhängigkeitsdeklarationen im POM ansehe, habe ich das Gefühl, dass alles in Ordnung ist. Wenn Sie es im Terminal ausführen, wird bestätigt, dass es wie erwartet funktioniert. Ich habe also das Gefühl, dass Intellij Schwierigkeiten hat, die Abhängigkeiten aufzulösen, aber ich bin mir nicht sicher. Weiß jemand, was ich möglicherweise falsch gemacht habe, oder sollte ich Intellij anders konfigurieren? Als Randbemerkung habe ich ungültige Caches ausgeführt. Ich habe es unter Mac OS und Linux/Pop OS versucht und habe die gleichen Fehler erhalten.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post