簡體   English   中英

java.lang.NoClassDefFoundError: org/quartz/SchedulerFactory

[英]java.lang.NoClassDefFoundError: org/quartz/SchedulerFactory

我正在使用 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

讓我知道是否需要任何額外信息。

您在 maven 中添加了依賴項這一事實僅意味着在編譯代碼時,quartz 的 jar 位於類路徑中。 這意味着您可以在代碼中使用來自 jar 的類/接口。

但是,一旦 maven 編譯您的代碼並創建 jar,您有責任安排“運行時”(您對java -jar所做的操作) 也就是你必須將quartz的jar添加到classpath中。 Maven 是一個構建框架,它不知道運行時。

有很多方法可以解決這個問題,僅舉幾例:

  1. 使用-cp標志運行並將所有 jars 添加到類路徑中。 在這種情況下,您必須提供所有 jars 的路徑,因此您可能需要將所有依賴項復制到某種“lib”文件夾中並與工件一起分發。 這在某種程度上是一種“老派”的方式來完成這項工作。

  2. Use "Fat Jar" (see here in case you're not familiar with this concept) which is - "bake" all the code from the dependent jars into one jar that you create ( test-rrule-quartz-1.0-SNAPSHOT.jar在這種情況下)。 這樣,結果 artifcat 會很大,但不需要其他依賴項。

  3. 更具異國情調但仍然可以方便使用 - 使用 spring 引導,它已經在特殊插件的幫助下將所有內容包裝到一個工件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM