我在部署Quarkus时遇到了一个问题,这个应用程序使用我们的部署系统注入的SPI实现。
在我们的pom中,我们指定了SPI接口(在它的静态初始化器中调用ServiceLoader.load(类))。在部署Quarkus应用程序时,我们分解QuarkusRunner jar,从清单中提取主类,并构造类似于"java -cp .QuarkusRunner“的命令行类路径包括quarkus中的所有内容-app/app、lib/boot和lib/main,以及我们打算使用的SPI实现。
当我们运行这个应用程序并尝试使用调用SPI ServiceLoader代码的代码时,我们会得到以下错误: java.util.ServiceConfigurationError::不是子类型。
我读到这是因为Quarkus使用的ClassLoader (它包含SPI-接口)和加载SPI-实现的ClassLoader都是不连接的(也就是说,彼此之间是隔离的)。
感兴趣的事物:
问:在这一点上,我完全不知道实际发生了什么。如何使我的SPI实现与Quarkus一起工作?
发布于 2021-05-01 07:58:38
在使用Quarkus的fast-jar时,几乎所有东西都是通过RunnerClassLoader加载到JVM中的(例外是类加载器本身,以及少量的支持类和实用程序库)。
您将考虑的类路径(即用户代码、Quarkus生成或转换的代码和依赖项)在构建时构建的quarkus-application.dat文件中进行索引,不能修改。
https://stackoverflow.com/questions/67336542
复制相似问题