如何配置Quarkus将SPI实现加载到特定的ClassLoader中



我在部署Quarkus应用程序时遇到问题,该应用程序使用我们的部署系统注入的SPI实现。

在pom中,我们指定SPI接口(它在静态初始化器中调用ServiceLoader.load(class((。当我们部署Quarkus应用程序时,我们分解QuarkusRunner jar,从MANIFEST中提取Main Class,并构造类似于";java-cp。。。io.quarkus.bootstrap.runner.QuarkusEntryPoint";。类路径包括quarkus-app/app、lib/boot和lib/main中的所有内容,以及我们打算使用的SPI实现。

当我们运行应用程序并尝试使用调用SPI ServiceLoader代码的代码时,我们会收到以下错误:java.util.ServiceConfigurationError::不是子类型。

我读到这是因为Quarkus使用的ClassLoader(包含SPI接口(和加载SPI实现的ClassLoaders不知何故没有连接(即彼此隔离(。

感兴趣的事物:

  • 我们使用的是Quarkus 1.13.2-Final
  • 我试图让我们的SPI接口成为parentFirstArtifact(它没有依赖项(,但没有成功
  • 查看QuarkusEntryPoint的代码,它似乎将放置在maven构建期间创建的quarkus/quarkus-application.dat中的所有类加载到quarkus RunnerClassLoader中,后者的父级是System ClassLoader。我的假设是类路径上的项目被添加到System ClassLoader中

问题:在这一点上,我完全不知道实际发生了什么如何让SPI实现与Quarkus一起工作

使用Quarkus的fast-jar时,几乎所有内容都通过RunnerClassLoader加载到JVM中(类加载器本身以及少量支持类和实用程序库除外(。

您认为类路径(即用户代码、Quarkus生成或转换的代码和依赖项(在quarkus-application.dat文件中进行了索引,该文件在构建时构建,无法修改。

最新更新