[英]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.