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();