java .lang.NoClassDefFoundError: org / quartz / SchedulerFactory - PullRequest
0 голосов
/ 26 мая 2020

Я пишу приложение, используя Java библиотеку Quartz.

Мой pom. xml имеет следующие зависимости.

<dependencies>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.pranayhere</groupId>
            <artifactId>recurr</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
    </dependencies>

Он работает, когда я запускаю это в intellij, но не работает, когда я использую java -jar target/application.jar

Я получаю следующую ошибку:

java -jar target/test-rrule-quartz-1.0-SNAPSHOT.jar 
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/quartz/SchedulerFactory
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.quartz.SchedulerFactory
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 7 more

Сообщите мне, требуется ли дополнительная информация.

1 Ответ

3 голосов
/ 26 мая 2020

Тот факт, что вы добавили зависимость в maven, означает только то, что пока вы компилируете свой код, jar of quartz находится в пути к классам. Это означает, что вы можете использовать классы / интерфейсы из этого jar-файла в своем коде.

Однако после того, как maven скомпилирует ваш код и jar будет создан, вы обязаны организовать «среду выполнения» (что вы делаете с java -jar). То есть вам нужно добавить банку кварца в путь к классам. Maven - это фреймворк для сборки, он ничего не знает о времени выполнения.

Есть много способов решить эту проблему, например:

  1. Запуск с -cp flag и добавьте все jar-файлы в путь к классам. В этом случае вам нужно будет указать путь ко всем jar-файлам, поэтому, вероятно, вы захотите скопировать все зависимости в какую-то папку «lib» и распространить вместе с артефактом. Это в некотором роде способ сделать эту работу "старой школы".

  2. Используйте «Fat Jar» (см. здесь , если вы не знакомы с этой концепцией), который - «запекать» весь код из зависимых jar-файлов. в одну созданную вами банку (в данном случае test-rrule-quartz-1.0-SNAPSHOT.jar). Таким образом, результат artifcat будет большим, но для него не потребуются другие зависимости.

  3. Еще exoti c, но все же может быть удобно - используйте Spring boot, он уже объединяет все в одно артефакт с помощью специального плагина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...