java.lang.NoClassDefFoundError: orgquartzSchedulerFactory

问题描述 投票:0回答:1

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

让我知道是否需要任何额外的信息。

java quartz-scheduler
1个回答
3
投票

事实上,你在maven中添加了依赖关系,只是意味着当你编译代码时,石英的jar在classpath中。这意味着你可以在代码中使用该jar中的classesInterfaces。

然而,一旦maven编译了你的代码,并且创建了jar,你就有责任安排一个 "运行时"(就像你使用 java -jar). 也就是说,你必须把石英的jar添加到classpath中。Maven是一个构建框架,它没有关于运行时的知识。

有很多方法可以解决这个问题,举几个例子。

  1. 用以下几种方法: -cp 标志,并将所有的 jars 添加到 classpath 中。在这种情况下,你必须提供所有 jars 的路径,所以你可能会想把所有的依赖关系复制到某种 "lib "文件夹中,然后和工件一起发布。这是一种 "老派 "的方法。

  2. 使用 "Fat Jar"(见 此处 如果你不熟悉这个概念的话),这就是--将所有依赖的jar的代码 "烘焙 "到你创建的一个jar中(即test-rrule-quartz-1.0-SNAPSHOT.jar 在这种情况下)。) 这样一来,结果artifcat会很大,但它不需要其他的依赖关系。

  3. 更异国情调但仍然可以很方便--使用spring boot,它已经通过一个特殊的插件将所有的东西包装成一个工件。

© www.soinside.com 2019 - 2024. All rights reserved.