Search code examples
javaclassloaderquarkusdebezium

ClassNotFoundException using QuarkusClassLoader with local class and Debezium Engine


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

I'm trying to figure out why I get java.lang.ClassNotFoundException when I try to load com.mycompany.service.SomeClass. This class is defined locally in the project, I'm getting this error when I start my Quarkus app (mvn compile quarkus:dev). If I use another class loader (i.e. this.getClass().getClassLoader()), this error does not happen. It seems like it only happens with QuarkusClassLoader

EDIT: I think in the end the problem was related to Debezium Engine initialisation. That exception was thrown when calling the following line:

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

See my answer for how I fixed it


Solution

  • I fixed this by passing Thread.currentThread().getContextClassLoader() in the engine initialisation.

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