reactor / BlockHound

Java agent to detect blocking calls from non-blocking threads.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

NoClassDefFoundError with Java 11

garyrussell opened this issue · comments

This app, when run with Java8 reproduces reactor/reactor-kafka#215 (fixed by this PR).

rkgh215.zip

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!