java - 本地依赖的 Quarkus ClassNotFoundException
问题描述
我正在尝试将项目迁移到 Quarkus。该项目依赖于本地 .jar 文件。使用 Quarkus 运行应用程序会导致java.lang.NoClassDefFoundError
/java.lang.ClassNotFoundException
用于驻留在所述 jar 中的类。
我使用 gradle 作为构建工具,并使用以下方法将本地 jar 文件添加为依赖项:
implementation fileTree(dir: 'libs', include: ['*.jar'])
假设库包含一些Foo
带有静态方法的类init()
,那么以下代码会导致错误:
// From the local jar
import org.somepackage.Foo;
@Startup
@Singleton
public class Main {
@PostConstruct
public void initLocalLibrary() {
Foo.init();
}
}
确切的输出是
2020-04-19 18:31:21,266 ERROR [io.qua.application] (main) Failed to start application: java.lang.NoClassDefFoundError: org/somepackage/Foo
at Main.initLocalLibrary(Main.java:)
at Main.initLocalLibrary_Bean.create(Main_Bean.zig:129)
at Main_Bean.create(Main_Bean.zig:183)
Caused by: java.lang.ClassNotFoundException: org.somepackage.Foo
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:322)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:275)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:322)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:275)
... 35 more
2020-04-19 18:31:21,302 ERROR [io.qua.dev.DevModeMain] (main) Failed to start Quarkus: java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:232)
at io.quarkus.runtime.Application.start(Application.java:90)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.runner.bootstrap.StartupActionImpl.run(StartupActionImpl.java:99)
at io.quarkus.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:60)
at io.quarkus.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:236)
at io.quarkus.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:39)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:131)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:84)
at io.quarkus.dev.DevModeMain.start(DevModeMain.java:113)
at io.quarkus.dev.DevModeMain.main(DevModeMain.java:54)
在没有 Quarkus 的情况下运行应用程序可以正常工作。
解决方案
请尝试更换
implementation fileTree(dir: 'libs', include: ['*.jar'])
和
api fileTree(dir: 'libs', include: ['*.jar'])
推荐阅读
- html - 如何选择样式并将其应用于自定义标签
- bash - Bash:复制根/当前文件夹中具有相同扩展名的所有文件,但文件名包含特定字符串的文件除外
- javascript - Angular Typescript 动态地为类属性赋值
- flutter - 如何返回包含图像的列
- bash - 在服务器上创建 EBS 快照的问题(Linux EC2 实例)
- mongodb - docker-entrypoint-initdb.d 不执行脚本
- javascript - jsPDF autoTable没有在PDF中正确显示原始尺寸的图像
- reactjs - 如何在 React-Navigation V5 中动态显示抽屉项目?
- javascript - 组件与 Vue.js 中的存储数据不匹配
- python - python中使用两个for循环的字谜列表