我正在使用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中的类/接口。
但是,一旦maven编译了代码并创建了jar,则您有责任安排“运行时”(对进行操作java -jar
)。也就是说,您必须将石英罐添加到类路径中。Maven是一个构建框架,它不了解运行时。
解决此问题的方法有很多,仅举几例:
运行带有-cp
标志并将所有的罐子添加到类路径。在这种情况下,您必须提供所有jar的路径,因此可能需要将所有依赖项复制到某种“ lib”文件夹中,并随工件一起分发。这在某种程度上是完成这项工作的“老派”方法。
使用“胖罐子”(如果您不熟悉此概念,请参见此处),即-将所有代码从依赖罐子“烘焙”到您创建的一个罐子中(test-rrule-quartz-1.0-SNAPSHOT.jar
在这种情况下)。这样,结果artifcat将很大,但是不需要其他依赖项。
更具异国情调,但仍然可以派上用场-使用Spring Boot,它已经借助特殊的插件将所有内容包装到一个工件中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句