Torsten Mielke created CAMEL-24667:
--------------------------------------
Summary: camel-http: UnsatisfiedLinkError for Brotli4j when using
Quarkus runtime
Key: CAMEL-24667
URL: https://issues.apache.org/jira/browse/CAMEL-24667
Project: Camel
Issue Type: Bug
Components: camel-http
Affects Versions: 4.22.0
Reporter: Torsten Mielke
Assignee: Torsten Mielke
*Description*
When running a Camel route that uses the HTTP component (`toD` with `https://`
URI) with the Quarkus runtime (e.g. via {{{}camel run --runtime=quarkus{}}}),
the route fails with:{{{}{}}}
{code:java}
java.lang.UnsatisfiedLinkError: 'java.nio.ByteBuffer
com.aayushatharva.brotli4j.decoder.DecoderJNI.nativeCreate(long[])'{code}
{{}}
The same route works fine with Camel Main and Spring Boot runtimes.
A sample route in YAML DSL would be
{code:java}
- route:
from:
uri: timer:test
parameters:
period: "2000"
repeatCount: 1
steps:
- toD:
uri: "https://jsonplaceholder.typicode.com/posts/1"
parameters:
throwExceptionOnFailure: true
- log: ${body}{code}
*Root Cause*
The {{quarkus-vertx-http}} dependency transitively pulls in the {{brotli4j}}
API jar. However, brotli4j uses Maven profile activation to include
platform-specific native JNI artifacts (e.g. {{{}native-osx-aarch64{}}}), and
Maven does not activate profiles in transitive dependency POMs. This means:
1. The {{brotli4j}} Java API classes are on the classpath
2. The platform-native JNI library (`.dylib`/`.so`) is *not* on the classpath
3. Apache HttpClient 5's {{Brotli4jRuntime.available()}} check passes (it only
checks class presence via {{Class.forName}} with {{{}initialize=false{}}}, not
JNI loadability)
4. HttpClient registers a Brotli content decoder and adds {{br}} to the
{{Accept-Encoding}} request header
5. The server responds with Brotli-compressed content
6. Decompression fails with {{UnsatisfiedLinkError}} because the native library
was never loaded
With Camel Main and Spring Boot, brotli4j is declared optional in httpclient5
and nothing else pulls it in, so the Brotli decoder is never registered and the
issue does not occur.
*Workaround*
Disable compression in `application.properties`:
{{camel.component.http.contentCompressionDisabled=true}}
{{camel.component.https.contentCompressionDisabled=true}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)