diff --git a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc
index 3d944ec0bafb7..b7b242cfd7ba2 100644
--- a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc
+++ b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc
@@ -53,70 +53,7 @@ include::{includes}/devtools/create-app.adoc[]
====
If you use Confluent Schema Registry, you don't need the `quarkus-apicurio-registry-avro` extension.
Instead, you need the `quarkus-confluent-registry-avro` extension and a few more dependencies.
-Also, you need to add the Confluent Maven repository to your build file:
-
-[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
-.pom.xml
-----
-
- ...
-
- io.quarkus
- quarkus-confluent-registry-avro
-
-
-
- io.quarkus
- quarkus-rest-client-reactive
-
-
- io.confluent
- kafka-avro-serializer
- 6.1.1
-
-
- jakarta.ws.rs
- jakarta.ws.rs-api
-
-
-
-
-
-
-
- confluent
- https://packages.confluent.io/maven/
-
- false
-
-
-
-----
-
-[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
-.build.gradle
-----
-repositories {
- ...
-
- maven {
- url "https://packages.confluent.io/maven/"
- }
-}
-
-dependencies {
- ...
-
- implementation("io.quarkus:quarkus-confluent-registry-avro")
-
- // Confluent registry libraries use JAX-RS client
- implementation("io.quarkus:quarkus-rest-client-reactive")
-
- implementation("io.confluent:kafka-avro-serializer:6.1.1") {
- exclude group: "jakarta.ws.rs", module: "jakarta.ws.rs-api"
- }
-}
-----
+See <> for details.
====
== Avro schema
@@ -673,6 +610,87 @@ public class MovieResourceTest {
}
----
+[[confluent]]
+== Using the Confluent Schema Registry
+
+If you want to use the Confluent Schema Registry, you need the `quarkus-confluent-registry-avro` extension, instead of the `quarkus-apicurio-registry-avro` extension.
+Also, you need to add a few dependencies and a custom Maven repository to your `pom.xml` / `build.gradle` file:
+
+[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"]
+.pom.xml
+----
+
+ ...
+
+
+ io.quarkus
+ quarkus-confluent-registry-avro
+
+
+
+ io.quarkus
+ quarkus-rest-client-reactive
+
+
+ io.confluent
+ kafka-avro-serializer
+ 7.2.0
+
+
+ jakarta.ws.rs
+ jakarta.ws.rs-api
+
+
+
+
+
+
+
+
+ confluent
+ https://packages.confluent.io/maven/
+
+ false
+
+
+
+----
+
+[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"]
+.build.gradle
+----
+repositories {
+ ...
+
+ maven {
+ url "https://packages.confluent.io/maven/"
+ }
+}
+
+dependencies {
+ ...
+
+ implementation("io.quarkus:quarkus-confluent-registry-avro")
+
+ // Confluent registry libraries use JAX-RS client
+ implementation("io.quarkus:quarkus-rest-client-reactive")
+
+ implementation("io.confluent:kafka-avro-serializer:7.2.0") {
+ exclude group: "jakarta.ws.rs", module: "jakarta.ws.rs-api"
+ }
+}
+----
+
+In JVM mode, any version of `io.confluent:kafka-avro-serializer` can be used.
+In native mode, Quarkus only supports the following versions:
+
+* 6.2.x
+* 7.0.x
+* 7.1.x
+* 7.2.x
+
+For any other versions, the native configuration may need to be adjusted.
+
== Avro code generation details
In this guide we used the Quarkus code generation mechanism to generate Java files
diff --git a/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java b/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java
index ee0f05e8a3a73..e2318f783a938 100644
--- a/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java
+++ b/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java
@@ -1,15 +1,39 @@
package io.quarkus.confluent.registry.avro;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import org.jboss.logging.Logger;
+
import io.quarkus.deployment.Feature;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
+import io.quarkus.maven.dependency.ResolvedDependency;
public class ConfluentRegistryAvroProcessor {
+
+ public static final String CONFLUENT_GROUP_ID = "io.confluent";
+ public static final String CONFLUENT_ARTIFACT_ID = "kafka-avro-serializer";
+
+ private static final Logger LOGGER = Logger.getLogger(ConfluentRegistryAvroProcessor.class.getName());
+ public static final String CONFLUENT_REPO = "https://packages.confluent.io/maven/";
+ public static final String GUIDE_URL = "https://quarkus.io/guides/kafka-schema-registry-avro";
+
@BuildStep
- FeatureBuildItem feature() {
+ FeatureBuildItem featureAndCheckDependency(CurateOutcomeBuildItem cp) {
+ if (findConfluentSerde(cp.getApplicationModel().getDependencies()).isEmpty()) {
+ LOGGER.warnf("The application uses the `quarkus-confluent-registry-avro` extension, but does not " +
+ "depend on `%s:%s`. Note that this dependency is only available from the `%s` Maven " +
+ "repository. Check %s for more details.",
+ CONFLUENT_GROUP_ID, CONFLUENT_ARTIFACT_ID, CONFLUENT_REPO, GUIDE_URL);
+ }
+
return new FeatureBuildItem(Feature.CONFLUENT_REGISTRY_AVRO);
}
@@ -22,9 +46,31 @@ public void confluentRegistryAvro(BuildProducer reflec
"io.confluent.kafka.serializers.KafkaAvroSerializer"));
}
+ @BuildStep
+ public void configureNative(BuildProducer config, CurateOutcomeBuildItem cp) {
+ Optional serde = findConfluentSerde(cp.getApplicationModel().getDependencies());
+ if (serde.isPresent()) {
+ String version = serde.get().getVersion();
+ if (version.startsWith("7.1") || version.startsWith("7.2")) {
+ // Only required for Confluent Serde 7.1.x and 7.2.x
+ config.produce(NativeImageConfigBuildItem.builder()
+ .addRuntimeInitializedClass("io.confluent.kafka.schemaregistry.client.rest.utils.UrlList").build());
+ }
+ }
+ }
+
@BuildStep
ExtensionSslNativeSupportBuildItem enableSslInNative() {
return new ExtensionSslNativeSupportBuildItem(Feature.CONFLUENT_REGISTRY_AVRO);
}
+ private Optional findConfluentSerde(Collection dependencies) {
+ return dependencies.stream().filter(new Predicate() {
+ @Override
+ public boolean test(ResolvedDependency rd) {
+ return rd.getGroupId().equalsIgnoreCase(CONFLUENT_GROUP_ID)
+ && rd.getArtifactId().equalsIgnoreCase(CONFLUENT_ARTIFACT_ID);
+ }
+ }).findAny();
+ }
}