本地运行正常的Spring Boot应用在AWS EC2 Docker环境启动失败求助
问题分析与解决方案
从你提供的错误日志和配置来看,核心问题是运行时缺失Hibernate Spatial依赖及其关联的JTS库,导致NoClassDefFoundError: org/locationtech/jts/geom/Geometry,进而引发Spring应用启动失败、JPA EntityManagerFactory初始化异常。
直接解决方案
修改你的build.gradle中Hibernate Spatial的依赖范围:
// 将原来的compileOnly替换为implementation implementation 'org.hibernate:hibernate-spatial'
修改完成后,重新执行以下操作:
- 运行
./gradlew clean build --exclude-task test重新构建可执行jar包 - 重新构建Docker镜像并部署到EC2环境
原因解释
你原本使用的compileOnly依赖范围,仅让该库在编译阶段生效,不会被打包到最终的可执行jar文件中。而Hibernate Spatial在运行时需要依赖JTS(Java Topology Suite)库(org.locationtech.jts.geom.Geometry就属于这个库)来处理空间数据类型,当应用在Docker环境中启动时,JVM找不到这些必要的类,就会抛出NoClassDefFoundError,最终导致Spring应用启动失败,JPA的EntityManagerFactory也无法完成初始化。
额外验证点
- 确认
application.yml中的空间方言配置正确:
这个配置适配MySQL空间数据类型,无需修改。database-platform: org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect - 验证重新构建后的jar包是否包含相关类:可以执行
jar tf build/libs/runner-0.0.1-SNAPSHOT.jar | grep jts命令,如果输出包含JTS相关的类路径,说明依赖已正确打包。
内容的提问来源于stack exchange,提问作者J. Chloe Lee
相关产品推荐
相关产品推荐

