NoClassDefFoundError with Java 11
garyrussell opened this issue · comments
This app, when run with Java8 reproduces reactor/reactor-kafka#215 (fixed by this PR).
When run with Java 11 (./mvnw spring-boot:run
), however, it fails with:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.kafka.common.utils.AppInfoParser
at org.apache.kafka.common.requests.ApiVersionsRequest$Builder.<clinit>(ApiVersionsRequest.java:38) ~[kafka-clients-2.6.1.jar:na]
at org.apache.kafka.clients.NetworkClient.handleConnections(NetworkClient.java:910) ~[kafka-clients-2.6.1.jar:na]
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:555) ~[kafka-clients-2.6.1.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:325) ~[kafka-clients-2.6.1.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:240) ~[kafka-clients-2.6.1.jar:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Strangely, this problem goes away when I compile/run with the snapshot containing the above reference PR for reactor-kafka.
Feel free to close this if you don't think it warrants investigation.
@garyrussell AppInfoParser
has this code:
static {
Properties props = new Properties();
try (InputStream resourceStream = AppInfoParser.class.getResourceAsStream("/kafka/kafka-version.properties")) {
props.load(resourceStream);
} catch (Exception e) {
log.warn("Error while loading kafka-version.properties: {}", e.getMessage());
}
VERSION = props.getProperty("version", DEFAULT_VALUE).trim();
COMMIT_ID = props.getProperty("commitId", DEFAULT_VALUE).trim();
}
it is indeed blocking, so BlockHound barks and the classloading fails (as the static blocks are executed at the classloading time)
Ah - thanks; understood; since the constructor is now called on the other thread (with my r-k PR), we're good.
Closing this.
Hi @garyrussell . Looks like the issue has been occured again in recent versions.
2023-02-14 14:57:56,239 [,] ERROR [ ws-user-client] o.a.k.c.u.KafkaThread : Uncaught exception in thread 'kafka-producer-network-thread | ws-user-client':
java.lang.NoClassDefFoundError: Could not initialize class org.apache.kafka.common.utils.AppInfoParser
at org.apache.kafka.common.requests.ApiVersionsRequest$Builder.<clinit>(ApiVersionsRequest.java:37)
at org.apache.kafka.clients.NetworkClient.handleConnections(NetworkClient.java:950)
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:571)
at org.apache.kafka.clients.NetworkClientUtils.awaitReady(NetworkClientUtils.java:73)
at org.apache.kafka.clients.producer.internals.Sender.awaitNodeReady(Sender.java:526)
at org.apache.kafka.clients.producer.internals.Sender.maybeSendAndPollTransactionalRequest(Sender.java:447)
at org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:316)
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:243)
at java.base/java.lang.Thread.run(Thread.java:829)
Do we have any workaround?
@Abdulkhakimov Try calling AppInfoParser.getVersion()
on the main thread before starting any reactive workloads; that should initialize the static.
@garyrussell It all worked without any barking from BlockHound. Very grateful for the help!