This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 42cccd42eec Fixes #9261. Make Debezium extensions more resilient to
version upgrades
42cccd42eec is described below
commit 42cccd42eecc9a16e3379d25d0799691dd20af10
Author: James Netherton <[email protected]>
AuthorDate: Mon Nov 2 16:17:06 2026 +0000
Fixes #9261. Make Debezium extensions more resilient to version upgrades
Replace the hand-maintained native registrations with build-time discovery:
* Index the io.debezium runtime dependencies (except debezium-ddl-parser)
and
register providers for all META-INF/services interfaces they declare,
excluding services the embedded engine never loads (component metadata,
sink connectors, transformations, Hibernate, Infinispan). Converter and
HeaderConverter providers are always registered
* Register implementations of the plugin types Debezium instantiates from
configured class names (SchemaHistory, SourceInfoStructMaker, SourceTask,
TopicNamingStrategy, TransactionMetadataFactory, TableMappingStorage,
ReselectColumnCache)
* Reduce the connector processors to their connector-specific registrations
* Remove registrations for classes and resources that no longer exist
* Add a test that fails when a Debezium configuration option defaults to a
class that is not registered for reflection
Co-authored-by: Claude Opus 5.5 <[email protected]>
---
extensions-support/debezium/deployment/pom.xml | 30 ++++
.../deployment/DebeziumSupportProcessor.java | 197 ++++++++++-----------
.../DebeziumConfigurablePluginsTest.java | 143 +++++++++++++++
.../deployment/DebeziumMongodbProcessor.java | 29 ++-
.../mysql/deployment/DebeziumMysqlProcessor.java | 23 ---
.../oracle/deployment/DebeziumOracleProcessor.java | 19 +-
.../deployment/DebeziumPostgresProcessor.java | 20 ---
.../deployment/DebeziumSqlserverProcessor.java | 27 ---
8 files changed, 282 insertions(+), 206 deletions(-)
diff --git a/extensions-support/debezium/deployment/pom.xml
b/extensions-support/debezium/deployment/pom.xml
index b831b15d61f..a155030193c 100644
--- a/extensions-support/debezium/deployment/pom.xml
+++ b/extensions-support/debezium/deployment/pom.xml
@@ -50,6 +50,36 @@
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-support-debezium</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-debezium-mongodb</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-debezium-mysql</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-debezium-oracle</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-debezium-postgres</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-debezium-sqlserver</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-junit-internal</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git
a/extensions-support/debezium/deployment/src/main/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumSupportProcessor.java
b/extensions-support/debezium/deployment/src/main/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumSupportProcessor.java
index dd4cf816e13..96b99d9b933 100644
---
a/extensions-support/debezium/deployment/src/main/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumSupportProcessor.java
+++
b/extensions-support/debezium/deployment/src/main/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumSupportProcessor.java
@@ -16,52 +16,84 @@
*/
package org.apache.camel.quarkus.support.debezium.deployment;
-import io.debezium.connector.base.DefaultQueueProvider;
-import io.debezium.connector.common.BaseSourceTask;
-import io.debezium.embedded.async.ConvertingAsyncEngineBuilderFactory;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import io.debezium.connector.SourceInfoStructMaker;
import io.debezium.engine.DebeziumEngine;
-import io.debezium.pipeline.notification.channels.NotificationChannel;
-import io.debezium.pipeline.signal.actions.SignalActionProvider;
-import io.debezium.pipeline.signal.actions.StandardActionProvider;
-import io.debezium.pipeline.signal.channels.FileSignalChannel;
-import io.debezium.pipeline.signal.channels.KafkaSignalChannel;
-import io.debezium.pipeline.signal.channels.SourceSignalChannel;
-import io.debezium.pipeline.signal.channels.jmx.JmxSignalChannel;
-import io.debezium.pipeline.signal.channels.process.InProcessSignalChannel;
-import io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory;
-import io.debezium.schema.SchemaTopicNamingStrategy;
-import io.debezium.snapshot.lock.NoLockingSupport;
-import io.debezium.snapshot.mode.AlwaysSnapshotter;
-import io.debezium.snapshot.mode.ConfigurationBasedSnapshotter;
-import io.debezium.snapshot.mode.InitialOnlySnapshotter;
-import io.debezium.snapshot.mode.InitialSnapshotter;
-import io.debezium.snapshot.mode.NoDataSnapshotter;
-import io.debezium.snapshot.mode.RecoverySnapshotter;
-import io.debezium.snapshot.mode.WhenNeededNoDataSnapshotter;
-import io.debezium.snapshot.mode.WhenNeededSnapshotter;
+import io.debezium.pipeline.txmetadata.spi.TransactionMetadataFactory;
+import io.debezium.processors.PostProcessorRegistry;
+import io.debezium.processors.reselect.cache.ReselectColumnCache;
+import io.debezium.relational.TableMappingStorage;
+import io.debezium.relational.history.SchemaHistory;
import io.debezium.snapshot.spi.SnapshotLock;
-import io.debezium.spi.storage.OffsetStoreProvider;
-import io.debezium.storage.file.history.FileSchemaHistory;
+import io.debezium.spi.topic.TopicNamingStrategy;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
-import
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
+import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
+import io.quarkus.maven.dependency.ResolvedDependency;
+import io.quarkus.paths.PathFilter;
import
org.apache.camel.quarkus.core.deployment.spi.CamelSerializationBuildItem;
import org.apache.camel.quarkus.support.debezium.DebeziumComponentObserver;
import org.apache.kafka.connect.source.SourceTask;
+import org.apache.kafka.connect.storage.Converter;
+import org.apache.kafka.connect.storage.FileOffsetBackingStore;
+import org.apache.kafka.connect.storage.HeaderConverter;
+import org.apache.kafka.connect.storage.KafkaOffsetBackingStore;
+import org.apache.kafka.connect.storage.MemoryOffsetBackingStore;
+import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
public class DebeziumSupportProcessor {
+ private static final String DEBEZIUM_GROUP_ID = "io.debezium";
+ private static final String SERVICES_PATH = "META-INF/services/";
+ // Holds no plugin implementations and would add thousands of ANTLR
classes to the index
+ private static final Set<String> UNINDEXED_ARTIFACTS =
Set.of("debezium-ddl-parser");
+
+ // Types whose implementations Debezium instantiates from class names held
in connector configuration
+ static final List<Class<?>> CONFIGURABLE_PLUGIN_TYPES = List.of(
+ ReselectColumnCache.class,
+ SchemaHistory.class,
+ SourceInfoStructMaker.class,
+ SourceTask.class,
+ TableMappingStorage.class,
+ TopicNamingStrategy.class,
+ TransactionMetadataFactory.class);
+
+ // Classes named by configuration defaults that are registered for
reflection individually
+ static final List<Class<?>> REFLECTIVE_CLASSES = List.of(
+ FileOffsetBackingStore.class,
+ MemoryOffsetBackingStore.class,
+ KafkaOffsetBackingStore.class,
+ DebeziumEngine.BuilderFactory.class,
+ SnapshotLock.class,
+ SourceTask.class);
+
+ // Services registered whether or not a Debezium artifact declares them
+ static final List<Class<?>> REQUIRED_SERVICES = List.of(Converter.class,
HeaderConverter.class);
+
+ // Services declared by Debezium artifacts that the embedded engine never
loads through ServiceLoader
+ static final Set<String> EXCLUDED_SERVICES = Set.of(
+ "io.debezium.metadata.ComponentMetadataProvider",
+ "org.apache.kafka.connect.sink.SinkConnector",
+ "org.apache.kafka.connect.transforms.Transformation",
+ "org.hibernate.boot.spi.MetadataSourcesContributor",
+ "org.infinispan.protostream.SerializationContextInitializer");
@BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
+ void addDependencies(CurateOutcomeBuildItem curateOutcome,
BuildProducer<IndexDependencyBuildItem> indexDependency) {
indexDependency.produce(new
IndexDependencyBuildItem("org.apache.kafka", "connect-json"));
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-api"));
+ debeziumDependencies(curateOutcome).stream()
+ .filter(dependency ->
!UNINDEXED_ARTIFACTS.contains(dependency.getArtifactId()))
+ .forEach(dependency -> indexDependency
+ .produce(new
IndexDependencyBuildItem(dependency.getGroupId(), dependency.getArtifactId())));
}
@BuildStep
@@ -95,85 +127,52 @@ public class DebeziumSupportProcessor {
.toArray(String[]::new);
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(dtos).fields().build());
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- "org.apache.kafka.connect.storage.FileOffsetBackingStore",
- "org.apache.kafka.connect.storage.MemoryOffsetBackingStore",
- "org.apache.kafka.connect.storage.KafkaOffsetBackingStore",
- "io.debezium.storage.kafka.history.KafkaSchemaHistory",
- "io.debezium.relational.history.FileDatabaseHistory",
- "io.debezium.embedded.ConvertingEngineBuilderFactory",
- "io.debezium.relational.ConcurrentMapTableMappingStorage")
- .build());
+ String[] plugins = CONFIGURABLE_PLUGIN_TYPES.stream()
+ .flatMap(type -> {
+ DotName name = DotName.createSimple(type);
+ return type.isInterface()
+ ? index.getAllKnownImplementations(name).stream()
+ : index.getAllKnownSubclasses(name).stream();
+ })
+ .filter(ci -> !ci.isInterface())
+ .map(ClassInfo::name)
+ .map(DotName::toString)
+ .toArray(String[]::new);
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(plugins).build());
-
reflectiveClasses.produce(ReflectiveClassBuildItem.builder("io.debezium.processors.PostProcessorRegistry")
- .methods()
- .build());
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(REFLECTIVE_CLASSES.toArray(Class<?>[]::new)).build());
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- DebeziumEngine.BuilderFactory.class,
- ConvertingAsyncEngineBuilderFactory.class,
- DefaultTransactionMetadataFactory.class,
- SchemaTopicNamingStrategy.class,
- BaseSourceTask.class,
- SnapshotLock.class,
- NoLockingSupport.class,
- AlwaysSnapshotter.class,
- InitialSnapshotter.class,
- InitialOnlySnapshotter.class,
- NoDataSnapshotter.class,
- RecoverySnapshotter.class,
- WhenNeededSnapshotter.class,
- WhenNeededNoDataSnapshotter.class,
- ConfigurationBasedSnapshotter.class,
- SourceSignalChannel.class,
- KafkaSignalChannel.class,
- FileSignalChannel.class,
- JmxSignalChannel.class,
- InProcessSignalChannel.class,
- StandardActionProvider.class,
- SourceTask.class,
- FileSchemaHistory.class,
- DefaultQueueProvider.class)
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(PostProcessorRegistry.class)
+ .methods()
.build());
-
- }
-
- @BuildStep
- ServiceProviderBuildItem registerConverterServiceProviders() {
- return
ServiceProviderBuildItem.allProvidersFromClassPath("org.apache.kafka.connect.storage.Converter");
}
@BuildStep
- ServiceProviderBuildItem registerSignalActionProviders() {
- return
ServiceProviderBuildItem.allProvidersFromClassPath(SignalActionProvider.class.getName());
+ void registerServiceProviders(
+ CurateOutcomeBuildItem curateOutcome,
+ BuildProducer<ServiceProviderBuildItem> serviceProvider) {
+ Set<String> services = new HashSet<>();
+ REQUIRED_SERVICES.forEach(service -> services.add(service.getName()));
+ PathFilter pathFilter = PathFilter.forIncludes(Set.of(SERVICES_PATH +
"*"));
+ debeziumDependencies(curateOutcome)
+ .forEach(dependency ->
dependency.getContentTree(pathFilter).walk(visit -> {
+ String resourceName = visit.getResourceName();
+ if (resourceName.length() > SERVICES_PATH.length()) {
+
services.add(resourceName.substring(SERVICES_PATH.length()));
+ }
+ }));
+
+ services.stream()
+ .filter(service -> !EXCLUDED_SERVICES.contains(service))
+ .map(ServiceProviderBuildItem::allProvidersFromClassPath)
+ .forEach(serviceProvider::produce);
}
- @BuildStep
- ServiceProviderBuildItem registerNotificationChannelProviders() {
- return
ServiceProviderBuildItem.allProvidersFromClassPath(NotificationChannel.class.getName());
- }
-
- @BuildStep
- ServiceProviderBuildItem registerOffsetStoreProviders() {
- return
ServiceProviderBuildItem.allProvidersFromClassPath(OffsetStoreProvider.class.getName());
+ private static List<ResolvedDependency>
debeziumDependencies(CurateOutcomeBuildItem curateOutcome) {
+ return curateOutcome.getApplicationModel()
+ .getRuntimeDependencies()
+ .stream()
+ .filter(dependency ->
dependency.getGroupId().equals(DEBEZIUM_GROUP_ID))
+ .toList();
}
-
- @BuildStep
- void
registerNativeImageResources(BuildProducer<NativeImageResourceBuildItem>
resources) {
- resources.produce(new NativeImageResourceBuildItem(
-
"META-INF/services/io.debezium.embedded.async.ConvertingAsyncEngineBuilderFactory"));
- resources.produce(
- new
NativeImageResourceBuildItem("META-INF/services/io.debezium.engine.DebeziumEngine$BuilderFactory"));
- resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.spi.snapshot.Snapshotter"));
- resources.produce(
- new
NativeImageResourceBuildItem("META-INF/services/io.debezium.pipeline.signal.channels.SignalChannelReader"));
- resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.processors.PostProcessorProducer"));
-
- resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.snapshot.spi.SnapshotLock"));
- resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.snapshot.spi.SnapshotQuery"));
- resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.connector.base.QueueProvider"));
- resources
- .produce(new
NativeImageResourceBuildItem("META-INF/services/org.apache.kafka.connect.source.SourceConnector"));
- }
-
}
diff --git
a/extensions-support/debezium/deployment/src/test/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumConfigurablePluginsTest.java
b/extensions-support/debezium/deployment/src/test/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumConfigurablePluginsTest.java
new file mode 100644
index 00000000000..6981edaf6c4
--- /dev/null
+++
b/extensions-support/debezium/deployment/src/test/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumConfigurablePluginsTest.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.support.debezium.deployment;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Modifier;
+import java.net.JarURLConnection;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import io.debezium.config.Field;
+import org.apache.kafka.common.config.ConfigDef;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Fails when a Debezium upgrade adds a configuration option whose default
value names a class that
+ * {@link DebeziumSupportProcessor} does not register for reflection. Only
options of type
+ * {@link ConfigDef.Type#CLASS} are checked: class names held in options of
other types, such as
+ * {@link ConfigDef.Type#STRING}, are not covered.
+ */
+class DebeziumConfigurablePluginsTest {
+ private static final String SERVICES_PATH = "META-INF/services/";
+ // Sink connectors are not supported by the Camel Debezium components
+ private static final String SINK_PACKAGE = ".sink.";
+
+ @Test
+ void configurationClassDefaultsAreRegisteredForReflection() throws
Exception {
+ ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
+ Set<String> serviceProviders = new HashSet<>();
+ Set<String> checked = new HashSet<>();
+ Set<String> unregistered = new TreeSet<>();
+
+ for (JarFile jar : debeziumJars(classLoader)) {
+ try (jar) {
+ for (JarEntry entry : Collections.list(jar.entries())) {
+ String entryName = entry.getName();
+ if (entryName.startsWith(SERVICES_PATH) &&
entryName.length() > SERVICES_PATH.length()
+ && !DebeziumSupportProcessor.EXCLUDED_SERVICES
+
.contains(entryName.substring(SERVICES_PATH.length()))) {
+ serviceProviders.addAll(readServiceProviders(jar,
entry));
+ } else if (entryName.endsWith(".class") &&
!entryName.contains("-")
+ && !entryName.replace('/',
'.').contains(SINK_PACKAGE)) {
+ String className = entryName.substring(0,
entryName.length() - 6).replace('/', '.');
+ for (String defaultClassName :
classDefaults(className, classLoader)) {
+ checked.add(defaultClassName);
+ if (!isRegistered(defaultClassName, classLoader)) {
+ unregistered.add(className + " -> " +
defaultClassName);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ assertFalse(checked.isEmpty(), "No Debezium configuration options with
class defaults were found");
+ unregistered.removeIf(entry ->
serviceProviders.contains(entry.substring(entry.indexOf(" -> ") + 4)));
+ assertTrue(unregistered.isEmpty(),
+ "Debezium configuration defaults name classes that are not
registered for reflection. "
+ + "Add their plugin type to
DebeziumSupportProcessor.CONFIGURABLE_PLUGIN_TYPES "
+ + "or register them individually: " + unregistered);
+ }
+
+ private static Set<JarFile> debeziumJars(ClassLoader classLoader) throws
IOException, URISyntaxException {
+ Set<JarFile> jars = new HashSet<>();
+ for (URL url :
Collections.list(classLoader.getResources("META-INF/maven/io.debezium"))) {
+ if (url.openConnection() instanceof JarURLConnection connection) {
+ jars.add(new
JarFile(Path.of(connection.getJarFileURL().toURI()).toFile()));
+ }
+ }
+ return jars;
+ }
+
+ private static Set<String> readServiceProviders(JarFile jar, JarEntry
entry) throws IOException {
+ Set<String> providers = new HashSet<>();
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(jar.getInputStream(entry),
StandardCharsets.UTF_8))) {
+ reader.lines()
+ .map(line -> line.replaceAll("#.*", "").trim())
+ .filter(line -> !line.isEmpty())
+ .forEach(providers::add);
+ }
+ return providers;
+ }
+
+ private static Set<String> classDefaults(String className, ClassLoader
classLoader) {
+ Set<String> defaults = new HashSet<>();
+ try {
+ Class<?> clazz = Class.forName(className, false, classLoader);
+ for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
+ if (Modifier.isStatic(field.getModifiers()) && field.getType()
== Field.class) {
+ field.setAccessible(true);
+ Field configField = (Field) field.get(null);
+ if (configField != null && configField.type() ==
ConfigDef.Type.CLASS
+ && configField.defaultValue() != null) {
+ Object defaultValue = configField.defaultValue();
+ defaults.add(defaultValue instanceof Class<?> type ?
type.getName() : defaultValue.toString());
+ }
+ }
+ }
+ } catch (Throwable e) {
+ // Classes that cannot be loaded or initialized without optional
dependencies hold no usable defaults
+ }
+ return defaults;
+ }
+
+ private static boolean isRegistered(String className, ClassLoader
classLoader) {
+ try {
+ Class<?> clazz = Class.forName(className, false, classLoader);
+ return DebeziumSupportProcessor.REFLECTIVE_CLASSES.contains(clazz)
+ ||
DebeziumSupportProcessor.CONFIGURABLE_PLUGIN_TYPES.stream()
+ .anyMatch(type -> type.isAssignableFrom(clazz));
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+}
diff --git
a/extensions/debezium-mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mongodb/deployment/DebeziumMongodbProcessor.java
b/extensions/debezium-mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mongodb/deployment/DebeziumMongodbProcessor.java
index ca9b9fac08c..653259cf6ca 100644
---
a/extensions/debezium-mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mongodb/deployment/DebeziumMongodbProcessor.java
+++
b/extensions/debezium-mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mongodb/deployment/DebeziumMongodbProcessor.java
@@ -16,16 +16,13 @@
*/
package org.apache.camel.quarkus.component.debezium.mongodb.deployment;
-import io.debezium.connector.mongodb.MongoDbConnector;
-import io.debezium.connector.mongodb.MongoDbConnectorTask;
-import io.debezium.connector.mongodb.MongoDbSourceInfoStructMaker;
-import io.debezium.connector.mongodb.connection.DefaultMongoDbAuthProvider;
-import io.debezium.connector.mongodb.snapshot.query.SelectAllSnapshotQuery;
+import io.debezium.connector.mongodb.connection.MongoDbAuthProvider;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.jboss.jandex.DotName;
class DebeziumMongodbProcessor {
@@ -37,18 +34,12 @@ class DebeziumMongodbProcessor {
}
@BuildStep
- void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem>
reflectiveClasses) {
-
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- MongoDbConnector.class,
- MongoDbConnectorTask.class,
- MongoDbSourceInfoStructMaker.class,
- DefaultMongoDbAuthProvider.class,
- SelectAllSnapshotQuery.class).build());
- }
-
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-mongodb"));
+ void reflectiveClasses(CombinedIndexBuildItem combinedIndex,
BuildProducer<ReflectiveClassBuildItem> reflectiveClasses) {
+ String[] authProviders = combinedIndex.getIndex()
+
.getAllKnownImplementations(DotName.createSimple(MongoDbAuthProvider.class))
+ .stream()
+ .map(ci -> ci.name().toString())
+ .toArray(String[]::new);
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(authProviders).build());
}
}
diff --git
a/extensions/debezium-mysql/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mysql/deployment/DebeziumMysqlProcessor.java
b/extensions/debezium-mysql/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mysql/deployment/DebeziumMysqlProcessor.java
index 40c6e671360..7192f472c14 100644
---
a/extensions/debezium-mysql/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mysql/deployment/DebeziumMysqlProcessor.java
+++
b/extensions/debezium-mysql/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/mysql/deployment/DebeziumMysqlProcessor.java
@@ -16,15 +16,8 @@
*/
package org.apache.camel.quarkus.component.debezium.mysql.deployment;
-import io.debezium.connector.mysql.MySqlConnector;
-import io.debezium.connector.mysql.MySqlConnectorTask;
-import io.debezium.connector.mysql.MySqlSourceInfoStructMaker;
-import io.debezium.connector.mysql.snapshot.query.SelectAllSnapshotQuery;
-import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
class DebeziumMysqlProcessor {
@@ -34,20 +27,4 @@ class DebeziumMysqlProcessor {
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}
-
- @BuildStep
- void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem>
reflectiveClasses) {
-
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- MySqlConnector.class,
- MySqlConnectorTask.class,
- MySqlSourceInfoStructMaker.class,
- SelectAllSnapshotQuery.class).build());
- }
-
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-mysql"));
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-binlog"));
- }
}
diff --git
a/extensions/debezium-oracle/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/oracle/deployment/DebeziumOracleProcessor.java
b/extensions/debezium-oracle/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/oracle/deployment/DebeziumOracleProcessor.java
index bab4e3ae75c..83bf04f7de4 100644
---
a/extensions/debezium-oracle/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/oracle/deployment/DebeziumOracleProcessor.java
+++
b/extensions/debezium-oracle/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/oracle/deployment/DebeziumOracleProcessor.java
@@ -16,16 +16,10 @@
*/
package org.apache.camel.quarkus.component.debezium.oracle.deployment;
-import io.debezium.connector.oracle.OracleConnector;
-import io.debezium.connector.oracle.OracleConnectorTask;
-import io.debezium.connector.oracle.OracleSourceInfoStructMaker;
import io.debezium.connector.oracle.logminer.buffered.BufferedLogMinerAdapter;
-import io.debezium.connector.oracle.snapshot.query.SelectAllSnapshotQuery;
-import io.debezium.storage.kafka.history.KafkaSchemaHistory;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import
io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
import oracle.jdbc.driver.OracleDriver;
@@ -41,20 +35,9 @@ class DebeziumOracleProcessor {
@BuildStep
void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem>
reflectiveClasses) {
-
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
OracleDriver.class,
- OracleConnector.class,
- OracleConnectorTask.class,
- OracleSourceInfoStructMaker.class,
- SelectAllSnapshotQuery.class,
- BufferedLogMinerAdapter.class,
- KafkaSchemaHistory.class).build());
- }
-
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-oracle"));
+ BufferedLogMinerAdapter.class).build());
}
@BuildStep
diff --git
a/extensions/debezium-postgres/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/postgres/deployment/DebeziumPostgresProcessor.java
b/extensions/debezium-postgres/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/postgres/deployment/DebeziumPostgresProcessor.java
index d92f552db75..74691435603 100644
---
a/extensions/debezium-postgres/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/postgres/deployment/DebeziumPostgresProcessor.java
+++
b/extensions/debezium-postgres/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/postgres/deployment/DebeziumPostgresProcessor.java
@@ -16,11 +16,8 @@
*/
package org.apache.camel.quarkus.component.debezium.postgres.deployment;
-import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import
io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
class DebeziumPostgresProcessor {
@@ -32,25 +29,8 @@ class DebeziumPostgresProcessor {
return new FeatureBuildItem(FEATURE);
}
- @BuildStep
- void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem>
reflectiveClasses) {
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- "io.debezium.connector.postgresql.PostgresConnector",
- "io.debezium.connector.postgresql.PostgresConnectorTask",
-
"io.debezium.connector.postgresql.PostgresSourceInfoStructMaker",
-
"io.debezium.connector.postgresql.snapshot.lock.NoSnapshotLock",
-
"io.debezium.connector.postgresql.snapshot.lock.SharedSnapshotLock",
-
"io.debezium.connector.postgresql.snapshot.query.SelectAllSnapshotQuery")
- .build());
- }
-
@BuildStep
RuntimeInitializedClassBuildItem runtimeInitializedClasses() {
return new
RuntimeInitializedClassBuildItem("com.google.protobuf.JavaFeaturesProto");
}
-
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-postgres"));
- }
}
diff --git
a/extensions/debezium-sqlserver/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/sqlserver/deployment/DebeziumSqlserverProcessor.java
b/extensions/debezium-sqlserver/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/sqlserver/deployment/DebeziumSqlserverProcessor.java
index f06a9c269d7..2567d1f07ac 100644
---
a/extensions/debezium-sqlserver/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/sqlserver/deployment/DebeziumSqlserverProcessor.java
+++
b/extensions/debezium-sqlserver/deployment/src/main/java/org/apache/camel/quarkus/component/debezium/sqlserver/deployment/DebeziumSqlserverProcessor.java
@@ -16,11 +16,8 @@
*/
package org.apache.camel.quarkus.component.debezium.sqlserver.deployment;
-import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
class DebeziumSqlserverProcessor {
@@ -30,28 +27,4 @@ class DebeziumSqlserverProcessor {
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}
-
- @BuildStep
- ReflectiveClassBuildItem reflectiveClasses() {
- return ReflectiveClassBuildItem.builder(new String[] {
"io.debezium.connector.sqlserver.SqlServerConnector",
- "io.debezium.connector.sqlserver.SqlServerConnectorTask"
}).build();
- }
-
- @BuildStep
- void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem>
reflectiveClasses) {
-
- reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
- "io.debezium.connector.sqlserver.SqlServerConnector",
- "io.debezium.connector.sqlserver.SqlServerConnectorTask",
-
"io.debezium.connector.sqlserver.SqlServerSourceInfoStructMaker",
- "io.debezium.connector.sqlserver.snapshot.lock.NoSnapshotLock",
-
"io.debezium.connector.sqlserver.snapshot.lock.ExclusiveSnapshotLock",
-
"io.debezium.connector.sqlserver.snapshot.query.SelectAllSnapshotQuery")
- .methods().fields().build());
- }
-
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-connector-sqlserver"));
- }
}