我正在使用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中添加了依赖关系,只是意味着当你编译代码时,石英的jar在classpath中。这意味着你可以在代码中使用该jar中的classesInterfaces。
然而,一旦maven编译了你的代码,并且创建了jar,你就有责任安排一个 "运行时"(就像你使用 java -jar
). 也就是说,你必须把石英的jar添加到classpath中。Maven是一个构建框架,它没有关于运行时的知识。
有很多方法可以解决这个问题,举几个例子。
用以下几种方法: -cp
标志,并将所有的 jars 添加到 classpath 中。在这种情况下,你必须提供所有 jars 的路径,所以你可能会想把所有的依赖关系复制到某种 "lib "文件夹中,然后和工件一起发布。这是一种 "老派 "的方法。
使用 "Fat Jar"(见 此处 如果你不熟悉这个概念的话),这就是--将所有依赖的jar的代码 "烘焙 "到你创建的一个jar中(即test-rrule-quartz-1.0-SNAPSHOT.jar
在这种情况下)。) 这样一来,结果artifcat会很大,但它不需要其他的依赖关系。
更异国情调但仍然可以很方便--使用spring boot,它已经通过一个特殊的插件将所有的东西包装成一个工件。