java ClassNotFoundException LoggerFactory при настройке Quartz

#java #classpath #quartz-scheduler #classnotfoundexception

#java #путь к классу #quartz-планировщик #classnotfoundexception

Вопрос:

Итак, я использую Quartz jar: quartz-all-2.0.1.jar . Из readme предполагается, что в этом jar должно быть все настроено. Однако, когда я пытаюсь создать SchedulerFactory с помощью

 SchedulerFactory sf = new StdSchedulerFactory();
  

Я получаю это:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at org.quartz.impl.StdSchedulerFactory.<init>(StdSchedulerFactory.java:268)
    at WebScraper.Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
  

Я также в замешательстве, потому что Eclipse не показывает никаких ошибок до того, как я попытаюсь запустить программу. Спасибо за любую помощь.

Ответ №1:

В документации Simple Logging Facade для Java (SLF4J) указано, что Quartz зависит от slf4j. Вы могли бы загрузить slf4j и добавить его в свой classpath. Я понятия не имею, почему это работало раньше без этой проблемы.

Комментарии:

1. Загрузка slf4j содержит множество файлов .jar. Я попытался включить slf4j-ext-1.6.1.jar и slf4j-simple-1.6.1.jar потому что они выглядели наиболее многообещающими. Но я не мог сказать, какой из пушечных slf4j использовать.

2. Я добавил slf4j-api-1.6.1.jar и slf4j-simple-1.6.1.jar чтобы заставить его работать.

3. Это первое предложение не имеет смысла. В нем должно быть указано, что Quartz зависит от slf4j.

4. Очевидно, что используется поиск по классу. Что означает, что это напрямую не зависит от него. Это зависит только от того, находится ли он в classpath, поэтому, когда classloader ищет его, он его находит. Ему не нужен класс, поэтому он никогда не пытался загрузить его раньше, но планировщик вызывает ClassLoader и попадает в hissyfitville.

Ответ №2:

Вам понадобится файл slf4j api jar и файл jar реализации.

Что касается того, почему он не жалуется в eclipse. Это всего лишь зависимость от времени выполнения. Вы не компилируете какой-либо код, который на самом деле использует slf4j, поэтому ваш код компилируется просто отлично. С другой стороны, при попытке запуска код, от которого вы зависите (т. Е. Quartz), зависит от slf4j, который вы теперь должны предоставить.