ClassNotFoundException使用带有本地类和Debezium引擎的QuarkusClassLoader


ClassLoader classLoader = QuarkusClassLoader.getSystemClassLoader();
String str = "com.mycompany.service.SomeClass";
try {
Class<? extends SomeClass> someClass =
(Class<? extends SomeClass>) classLoader.loadClass(str);
} catch (Throwable e) {
e.printStackTrace();
}

我试图弄清楚为什么在尝试加载com.mycompany.service.SomeClass时会得到java.lang.ClassNotFoundException。这个类是在项目中本地定义的,当我启动Quarkus应用程序(mvn-compile Quarkus:dev(时,我会收到这个错误。如果我使用另一个类加载器(即this.getClass((.getClassLoader(((,则不会发生此错误。这似乎只发生在QuarkusClassLoader 中

编辑:我认为最终问题与Debezium引擎初始化有关。调用以下行时引发了该异常:

// Create the engine with this configuration ...
engine =
DebeziumEngine.create(Json.class)
.using(props)
.notifying(this::handleDbChangeEvent)
.build();

查看我如何修复的答案

使用Classloader.getSystemClassLoader肯定不是正确的做法,因为在开发模式下(通常情况下,您很少想在Java代码中这样做(,Quarkus不是一个平面类加载器结构,而是一个分层的结构。

请参阅https://quarkus.io/guides/class-loading-reference有关开发模式下Classloading如何工作的更多详细信息。

您可以通过使用以下内容强制jar的所有类由系统ClassLoader而不是Quarkus ClassLoader加载:

quarkus.classloading.parent-first-actures=stax:stax-api

在这里,您基本上配置了应该由系统ClassLoader 加载的jar的groupId和artifactId

我通过在引擎初始化中传递Thread.currentThread().getContextClassLoader()解决了这个问题。

engine =
DebeziumEngine.create(Json.class)
// Have to pass the current class loader to avoid ClassNotFoundException
.using(Thread.currentThread().getContextClassLoader())
.using(props)
.notifying(this::handleDbChangeEvent)
.build();

相关内容

  • 没有找到相关文章

最新更新