Статьи

Как исправить исключение в потоке «основной» java.lang.NoClassDefFoundError: org / slf4j / LoggerFactory в Java

Эта ошибка означает, что ваш код или любая внешняя библиотека, которую вы используете в своем приложении, использует библиотеку SLF4J, библиотеку журналов с открытым исходным кодом, но она не может найти требуемый файл JAR, например, slf4j-api-1.7.2.jar следовательно, это выбрасывание исключения в потоке «main» java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory . Если вы посмотрите на ошибку, то увидите, что она не может найти класс org/slf4j/LoggerFactory или o rg.slf4j.LoggerFactory . Имя пакета указывает, что оно является частью SLF4j, поэтому вам нужны файлы JAR SLF4j, например, slf4j-api-1.7.2.jar в пути к классам вашего приложения. Итак, загрузите файл JAR с веб-сайта SLFj или из репозитория Maven Central и перезапустите приложение.

Кстати, SLF4j на самом деле не является API-интерфейсом журналирования, но он обеспечивает абстракцию над другими библиотеками журналирования, например, Log4j , java.util.logging или LogBak. Она похожа на библиотеку общего журнала, но в сложной среде она не портится из-за лучшего дизайна.

Используя SLF4j, вы можете переключаться на любую библиотеку журналов, не изменяя ни одной строки кода в вашем приложении, например, вы переключаетесь на Log4j с java.util.logging or LogBack .

Следовательно, кроме двоичных файлов SLF4j, вам также необходимы надлежащие двоичные файлы журналирования, например, log4j-1.2.16.jar или logback-1.2.3.jar если вы используете библиотеку LogBack. Это библиотеки, которые SLF4j будет вызывать для выполнения реальной работы.

Иногда вы получаете эту ошибку, когда ваш код на самом деле не использует SLF4j, но вы используете инструмент или библиотеку, которые внутренне его используют.

Например, я использовал log4jdbc.jar , инструмент для записи операторов SQL и их времени при выполнении кода JDBC, и он выдает мне эту ошибку:

01
02
03
04
05
06
07
08
09
10
11
12
13
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at net.sf.log4jdbc.Slf4jSpyLogDelegator.<init>(Slf4jSpyLogDelegator.java:45)
at net.sf.log4jdbc.SpyLogFactory.<clinit>(SpyLogFactory.java:37)
at net.sf.log4jdbc.DriverSpy.<clinit>(DriverSpy.java:106)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at Testing.main(Testing.java:15)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more

Поскольку моя программа была простой, и я не использовал API для ведения журнала, я был удивлен, откуда появилась эта ошибка, но быстрый взгляд на трассировку стека показал, что это
Класс net.sf.log4jdbc.DriverSpy который использует SLF4j для ведения журнала .

Позже, когда я прочитал документацию по log4jdbc, я понял, что нам нужны JAR-файлы SLF4J и Log4J, чтобы он работал. Поскольку я запускал свою тестовую программу в Eclipse, это было легко для меня, я просто бросил slf4j-api-1.7.2.jar и log4j-1.2.16.jar в каталог моего проекта. Поскольку он включен в classpath, его легко подобрать.

Кстати, проблемы с classpath не так-то просто решить для многих Java-программистов, потому что они не знают, куда именно поместить этот JAR-файл для решения своей проблемы. Поскольку настройка каждого приложения индивидуальна, я постараюсь охватить некоторые сценарии для устранения этой ошибки.

1. Если вы запускаете свою Java-программу с использованием пакетного сценария или сценария оболочки, найдите параметр -cp или -classpath и посмотрите, где он выбирает файлы JAR. Вы можете поместить в эти slf4j-api-1.7.2.jar и log4j-1.2.16.jar .

Если ваша программа работает на сервере Linux, вы можете просто сделать ps -ef | grep java и посмотрите аргументы JVM вашей Java-программы, чтобы узнать, какие каталоги находятся в пути к классам. Если у вас есть доступ к сценарию, вы также можете добавить новый каталог в classpath.

1
2
3
<b>$ ps -ef | grep java</b>
 
/opt/jre/v1.7.0_80-64bit/bin/java -Xmx8192M -Xms8192M -classpath /app/myapp.jar:/app/jackson.jar MyApplication

2. Если ваша программа использует переменную среды CLASSPATH, вам нужно просто slf4j-API-1.7.2.jar $CLASSPATH и поместить slf4j-API-1.7.2.jar и log4j-1.2.16.jar в каталог, уже присутствующий в CLASSPATH, или вы можете просто добавьте новый каталог в CLASSPATH. См. Эту статью, чтобы узнать, как внести изменения в переменную среды CLASSPATH .

3. Если вы используете Eclipse, просто slf4j-API-1.7.2.jar и log4j-1.2.16.jar в каталог вашего проекта. По умолчанию это путь к классу, поэтому JAR-файлы будут выбраны вашим приложением.

Как скачать файл SLF4j и Log4j JAR

Вы можете загрузить slf4j-api-1.7.2.jar и log4j-1.2.16.jar с соответствующих веб-сайтов, например, https://www.slf4j.org и https://logging.apache.org/log4j/1.2/download. .html или просто загрузите их из репозитория Maven Central.

Если вы используете Maven для построения своего проекта и управления зависимостями, вы также можете добавить следующую зависимость Maven для загрузки файлов SLF4J и Log4j JAR в свой проект:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- SLF4J API -->
 
<dependency>
 
<groupId>org.slf4j</groupId>
 
<artifactId>slf4j-api</artifactId>
 
<version>1.7.2</version>
 
</dependency>
 
<!-- LOG4J -->
 
<dependency>
 
<groupId>org.slf4j</groupId>
 
<artifactId>slf4j-log4j12</artifactId>
 
<version>1.2.16</version>
 
</dependency>

Как только вы добавите эти зависимости, убедитесь, что вы делаете чистую сборку из Maven, чтобы фактически загрузить эти зависимости из удаленного репозитория Maven.

Это все о том, как исправить исключение в потоке «main» java.lang.NoClassDefFoundError: org / slf4j / ошибка LoggerFactory в Java . Все, что вам нужно сделать, это добавить файлы slf4j-API-1.7.2.jar и log4j-1.2.16.jar в ваш путь к классам.

Версия может отличаться в зависимости от отдельных случаев, но вы должны добавить совместимую версию SLF4J и используемую вами библиотеку журналов. Например, если ваше приложение использует LogBack, вам нужно добавить соответствующую версию файла logback.jar.

Если вы используете Maven, вы также можете загрузить эти JAR-файлы, добавив соответствующие зависимости в pom.xml, в противном случае вы можете просто загрузить JAR-файл из Maven central или напрямую с веб-сайта SLF4j и Log4j и добавить в путь к классам вашего приложения.

Если вы обнаружите какие-либо проблемы с добавлением файлов JAR SLF4J и LOG4j в classpath, вы также можете сообщить нам об этом в разделе комментариев, и мы постараемся помочь вам.

Спасибо за чтение этого урока. Если вам нравится этот урок, поделитесь им с друзьями и коллегами. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте комментарий.

См. Оригинальную статью здесь: Как исправить исключение в потоке «main» java.lang.NoClassDefFoundError: org / slf4j / LoggerFactory в Java

Мнения, высказанные участниками Java Code Geeks, являются их собственными.