繁体   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