Spring Boot集成Apache Geode遇NoClassDefFoundError问题求助
Apache Geode CRUD应用启动报错:NoClassDefFoundError: SpringExtensions
问题场景
使用Apache Geode开发简单CRUD应用,通过以下命令启动Geode服务:
docker run -it apachegeode/geode
运行应用时抛出类找不到错误,具体堆栈信息如下:
错误堆栈
java.lang.NoClassDefFoundError: org/springframework/data/gemfire/util/SpringExtensions at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at org.springframework.geode.boot.autoconfigure.RegionTemplateAutoConfiguration.lambda$setAutoConfiguredRegionTemplateDependencies$3(RegionTemplateAutoConfiguration.java:215) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1620) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) at org.springframework.geode.boot.autoconfigure.RegionTemplateAutoConfiguration.setAutoConfiguredRegionTemplateDependencies(RegionTemplateAutoConfiguration.java:215) at org.springframework.geode.boot.autoconfigure.RegionTemplateAutoConfiguration.lambda$regionTemplateBeanFactoryPostProcessor$0(RegionTemplateAutoConfiguration.java:144) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:325) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:198) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at com.example.gemfirebasic.Application.main(Application.java:19) Caused by: java.lang.ClassNotFoundException: org.springframework.data.gemfire.util.SpringExtensions at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 31 common frames omitted
项目POM配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>00-gemfire-basic</artifactId> <version>0.0.1-SNAPSHOT</version> <name>00-gemfire-basic</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> <spring-geode.version>1.7.5</spring-geode.version> </properties> <dependencies> <dependency> <groupId>org.springframework.geode</groupId> <artifactId>spring-geode-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.geode</groupId> <artifactId>spring-geode-starter-session</artifactId> </dependency> <dependency> <groupId>org.springframework.geode</groupId> <artifactId>spring-geode-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.geode</groupId> <artifactId>spring-geode-starter-logging</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.geode</groupId> <artifactId>spring-geode-bom</artifactId> <version>${spring-geode.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
实体类Customer.java
@Region("Customers") @RequiredArgsConstructor(staticName = "create") @NoArgsConstructor @Data public class Customer { @Id @NonNull private Long id; @NonNull private String name; }
数据访问层CustomerRepository.java
public interface CustomerRepository extends CrudRepository<Customer, Long> { Customer findByNameLike(String name); }
主应用类Application.java
@SpringBootApplication @EnableEntityDefinedRegions(basePackageClasses = Customer.class, clientRegionShortcut = ClientRegionShortcut.LOCAL) public class Application implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Autowired private CustomerRepository customerRepository; @Override public void run(String... args) throws Exception { Customer c1 = Customer.create(1L, "John Doe"); Customer c2 = Customer.create(2L, "Jane Doe"); Customer c3 = Customer.create(3L, "Jack Doe"); Customer c4 = Customer.create(4L, "Mike Doe"); Customer c5 = Customer.create(5L, "Matt Doe"); customerRepository.saveAll(Arrays.asList(c1, c2, c3, c4, c5)); customerRepository.findAll().forEach(System.out::println); } }
解决方案
这个错误源于依赖版本不兼容或依赖缺失,可通过以下步骤修复:
- 显式引入Spring Data Geode依赖
在POM的<dependencies>块中添加:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-geode</artifactId> </dependency>
SpringExtensions类属于spring-data-geode包,当前依赖可能未自动引入该包。
- 统一Geode版本
Spring Geode 1.7.x对应Apache Geode官方版本为1.15.x,修改Docker启动命令指定匹配版本:
docker run -it apachegeode/geode:1.15.0
避免客户端与服务器版本不匹配导致的兼容性问题。
- 更新Spring Geode版本
将spring-geode.version升级到1.7.x系列的最新稳定版(如1.7.10),修复已知依赖问题:
<properties> <spring-geode.version>1.7.10</spring-geode.version> </properties>
- 清理并重新构建项目
执行Maven命令清理缓存并重新构建:
mvn clean install -U
内容的提问来源于stack exchange,提问作者PAA
相关产品推荐
相关产品推荐

