diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/VertxHttpProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/VertxHttpProcessor.java index eb6f40581ea60..71be04b9a2f60 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/VertxHttpProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/VertxHttpProcessor.java @@ -51,6 +51,7 @@ import io.quarkus.runtime.LiveReloadConfig; import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.shutdown.ShutdownConfig; +import io.quarkus.utilities.OS; import io.quarkus.vertx.core.deployment.CoreVertxBuildItem; import io.quarkus.vertx.core.deployment.EventLoopCountBuildItem; import io.quarkus.vertx.http.HttpServerOptionsCustomizer; @@ -514,16 +515,47 @@ private static boolean isSslConfigured() { @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) void brotliResources(HttpBuildTimeConfig httpBuildTimeConfig, BuildProducer resources, - BuildProducer runtimeInitializedClasses) { + BuildProducer runtimeInitializedClasses) throws BuildException { if (httpBuildTimeConfig.compressors.isPresent() && httpBuildTimeConfig.compressors.get().stream().anyMatch(s -> s.equalsIgnoreCase("br"))) { + final String arch = System.getProperty("os.arch"); + final boolean amd64 = arch.matches("^(amd64|x64|x86_64)$"); + final boolean aarch64 = "aarch64".equals(arch); + final String lib; + if (OS.determineOS() == OS.LINUX) { + if (amd64) { + lib = "linux-x86_64/libbrotli.so"; + } else if (aarch64) { + lib = "linux-aarch64/libbrotli.so"; + } else { + throw new BuildException("Brotli compressor: No library for linux-" + arch); + } + } else if (OS.determineOS() == OS.WINDOWS) { + if (amd64) { + lib = "windows-x86_64/brotli.dll"; + } else if (aarch64) { + lib = "windows-aarch64/brotli.dll"; + } else { + throw new BuildException("Brotli compressor: No library for windows-" + arch); + } + } else if (OS.determineOS() == OS.MAC) { + if (amd64) { + lib = "osx-x86_64/libbrotli.dylib"; + } else if (aarch64) { + lib = "osx-aarch64/libbrotli.dylib"; + } else { + throw new BuildException("Brotli compressor: No library for osx-" + arch); + } + } else { + throw new BuildException("Brotli compressor: Your platform is not supported."); + } resources.produce(NativeImageResourcePatternsBuildItem.builder() // We do have Brotli4J on classpath thanks to Vert.X -> Netty dependencies. .includePattern("\\QMETA-INF/services/com.aayushatharva.brotli4j.service.BrotliNativeProvider\\E") // Native library. We pick only the one relevant to our system. - .includePattern("\\Qlib/linux-x86_64/libbrotli.so\\E") + .includePattern("\\Qlib/" + lib + "\\E") .build()); // Static initializer tries to load the native library in Brotli4jLoader; must be done at runtime.