Skip to content

AOT Processing Fails with NoClassDefFoundError for Apache HttpClient 4.x Classes #3203

@mingchiuli

Description

@mingchiuli

AOT Processing Fails with NoClassDefFoundError for Apache HttpClient 4.x Classes

Environment

  • Spring Boot: 4.0.0
  • Spring Data Elasticsearch: (version bundled with Spring Boot 4.0.0)
  • Java: 25.0.1
  • Build Tool: Gradle

Description

When upgrading to Spring Boot 4.0.0 and running AOT processing (processAot task), the build fails with NoClassDefFoundError for Apache HttpClient 4.x classes.

Stack Trace

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/impl/auth/BasicScheme
	at org.springframework.data.elasticsearch.client.elc.aot.ElasticsearchClientRuntimeHints.registerHints(ElasticsearchClientRuntimeHints.java:46)
	at org.springframework.context.aot.RuntimeHintsBeanFactoryInitializationAotProcessor$RuntimeHintsRegistrarContribution.lambda$applyTo$0(RuntimeHintsBeanFactoryInitializationAotProcessor.java:117)
	at java.base/java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:834)
	at org.springframework.context.aot.RuntimeHintsBeanFactoryInitializationAotProcessor$RuntimeHintsRegistrarContribution.applyTo(RuntimeHintsBeanFactoryInitializationAotProcessor.java:111)
	at org.springframework.context.aot.BeanFactoryInitializationAotContributions.applyTo(BeanFactoryInitializationAotContributions.java:94)
	at org.springframework.context.aot.ApplicationContextAotGenerator.lambda$processAheadOfTime$0(ApplicationContextAotGenerator.java:59)
	at org.springframework.context.aot.ApplicationContextAotGenerator.withCglibClassHandler(ApplicationContextAotGenerator.java:68)
	at org.springframework.context.aot.ApplicationContextAotGenerator.processAheadOfTime(ApplicationContextAotGenerator.java:54)
	at org.springframework.context.aot.ContextAotProcessor.performAotProcessing(ContextAotProcessor.java:107)
	at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:84)
	at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:49)
	at org.springframework.context.aot.AbstractAotProcessor.process(AbstractAotProcessor.java:84)
	at org.springframework.boot.SpringApplicationAotProcessor.main(SpringApplicationAotProcessor.java:96)
Caused by: java.lang.ClassNotFoundException: org.apache.http.impl.auth.BasicScheme
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	... 13 more

Root Cause

The issue originates from ElasticsearchClientRuntimeHints.java at line 46, which attempts to register Apache HttpClient 4.x classes for serialization:

hints.serialization()
    .registerType(org.apache.http.impl.auth.BasicScheme.class)
    .registerType(org.apache.http.impl.auth.RFC2617Scheme.class)
    .registerType(java.util.HashMap.class);

However, Elasticsearch Java Client 8.x has migrated from Apache HttpClient 4.x to HttpClient 5.x, which uses different package names:

  • Old (HttpClient 4.x): org.apache.http.*
  • New (HttpClient 5.x): org.apache.hc.client5.* and org.apache.hc.core5.*

Gradle Dependencies

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-elasticsearch")
    // ... other dependencies
}

Expected Behavior

AOT processing should complete successfully without requiring Apache HttpClient 4.x classes.

Actual Behavior

AOT processing fails with NoClassDefFoundError because the referenced classes no longer exist in the classpath.

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions