NoClassDefFoundError: org/slf4j/LoggerFactory при работе в Intellij, но отлично работает из командной строкиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 NoClassDefFoundError: org/slf4j/LoggerFactory при работе в Intellij, но отлично работает из командной строки

Сообщение Anonymous »

У меня возникли проблемы, связанные с моими тестами, которые не удались из-за отсутствия slf4j-api, что не имеет смысла, поскольку оно присутствует, поскольку предоставляется как транзитивная зависимость от одной из библиотек.
Ошибка:

Код: Выделить всё

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 nl.altindag.ssl@10.0.1-SNAPSHOT/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
Это указывает на отсутствие slf4j-api. Однако дерево зависимостей mvn должно дать больше понимания того, что присутствует.

Код: Выделить всё

[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 предоставляется как транзитивная зависимость через ch.qos.logback:logback-core, который поступает из io.github.hakky54:logcaptor и org.java-websocket:Java-WebSocket, которые оба помечены как зависимости тестовой области.
Когда я запускаю mvn dependency:list он также правильно показывает, что slf4j-api присутствует, см. здесь:

Код: Выделить всё

[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
Я использую yaslf4j в качестве API для регистрации. Который пытается войти в API slf4j, возвращается к API log4j2, и если он также отсутствует, он возвращается к ведению журнала Java. Я использую этот специальный API для ведения журналов, поэтому я не заставляю конечного пользователя использовать slf4j, однако, если они используют slf4j, он будет перенаправлять журналы на slf4j. То же самое касается log4j2. А некоторые конечные пользователи вообще не предпочитают использовать API-интерфейс ведения журнала, и в этом случае он будет регистрировать его в журнале Java util. Pom yaslf4j объявил slf4j как предоставленную область действия, поэтому он не будет включен в качестве транзитивной зависимости для тех, кто будет его использовать. Библиотека ayza, в которой я столкнулся с этой проблемой, теперь во время тестов регистрируется в yaslf4j. Sfl4j API присутствует во время тестов, поэтому yaslf4j перенаправляет его на slf4j-api. Я использую log-captor для захвата этих журналов, поэтому я могу делать утверждения по ним, однако он не может создать регистратор, как он говорит: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
Странно то, что когда я запускаю mvn clean install с терминала, он работает. Когда я запускаю тест из intellij, как показано ниже, он терпит неудачу.
Изображение

Как воспроизвести?
  • запустить git clone https://github.com/Hakky54/ayza.git
  • запустите git switch Feature/make-slf4j-logger-optional
  • убедитесь, что настроена Java 11 или выше
  • запустите mvn clean install
Проанализируйте результат сборки, поскольку он покажет, что он был собран успешный.
  • Откройте проект из Intellij IDEA.
  • Запустите тест из проводника, как показано на снимке экрана выше.
Тест завершится неудачей.
Просматривая дерево зависимостей maven, список зависимостей maven и объявления зависимостей в pom, у меня возникает ощущение, что все в порядке. Запуск его в терминале подтверждает, что он работает как положено. Итак, я чувствую, что у intellij возникают проблемы с разрешением зависимостей, но я не уверен. Кто-нибудь знает, что я мог сделать неправильно или мне следует настроить intellij по-другому? В качестве примечания: я запускал недействительные кеши. Я пробовал это на Mac OS и Linux/pop OS, но с теми же сбоями.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -but-works
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»