[英]Spring 2.5 + quartz java.lang.NoClassDefFoundError: org/quartz/JobDetail
[英]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 是一個構建框架,它不知道運行時。
有很多方法可以解決這個問題,僅舉幾例:
使用-cp
標志運行並將所有 jars 添加到類路徑中。 在這種情況下,您必須提供所有 jars 的路徑,因此您可能需要將所有依賴項復制到某種“lib”文件夾中並與工件一起分發。 這在某種程度上是一種“老派”的方式來完成這項工作。
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 會很大,但不需要其他依賴項。
更具異國情調但仍然可以方便使用 - 使用 spring 引導,它已經在特殊插件的幫助下將所有內容包裝到一個工件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.