使用Ebean 13.25.2-jakarta连接MySQL时平台识别失败求助
我有一个基于Ebean 13.25.2-jakarta的项目,已引入io.ebean.ebean、io.ebean.ebean-ddl-generator依赖,采用编程方式配置Ebean:
dataSourceConfig.setUsername(configService.get(DB_USERNAME)); dataSourceConfig.setPassword(configService.get(DB_PASSWORD)); dataSourceConfig.setUrl(configService.get(DB_URL)); dataSourceConfig.setDriver(configService.get(DB_DRIVER)); dataSourceConfig.setPlatform(configService.get(DB_PLATFORM)); /* * configuration */ databaseConfig.setDdlGenerate(configService.getAsBoolean(DB_DDL_GENERATE)); databaseConfig.setDdlRun(configService.getAsBoolean(DB_DDL_GENERATE)); // databaseConfig.setDdlCreateOnly(false); databaseConfig.setDataSourceConfig(dataSourceConfig); /* * create database instance */ database = DatabaseFactory.create(databaseConfig);
单元测试时设置platform为h2可正常通过,但生产环境设置为mysql时抛出异常:
Caused by: jakarta.persistence.PersistenceException: java.lang.IllegalStateException: Unable to determine the appropriate ebean platform given database product name [mysql] and ebean platform providers [H2]. With ebean 13+ we now have separate platforms (ebean-postgres, ebean-mysql etc) and should use database specific platform dependency like ebean-postgres. Note that we can use ebean-platform-all to include all the platforms.
我尝试引入ebean-platform-all依赖后问题仍未解决。
测试环境数据库配置:
Username: sa Password: sa URL: jdbc:h2:file:~/ipdb.db Driver: org.h2.Driver Platform: h2 DDL Generate: true DDL Run: true
生产环境数据库配置:
Username: ipdb Password: 123qwe URL: jdbc:mysql://db/ipdb Driver: com.mysql.cj.jdbc.Driver Platform: mysql DDL Generate: true DDL Run: false
完整堆栈信息:
Configuration file: ipdb.properties Username: ipdb Password: 123qwe
URL: jdbc:mysql://db/ipdb Driver: com.mysql.cj.jdbc.Driver Platform:
mysql DDL Generate: true DDL Run: false
com.khubla.ipdb.db.service.ServiceException:
com.khubla.ipdb.db.service.ServiceException:
com.khubla.ipdb.db.DAOException: Exception in deleteAll at
com.khubla.ipdb.db.service.impl.DatabaseAdminServiceImpl.createDB(DatabaseAdminServiceImpl.java:60)
at com.khubla.ipdb.cli.Main.main(Main.java:101) Caused by:
com.khubla.ipdb.db.service.ServiceException:
com.khubla.ipdb.db.DAOException: Exception in deleteAll at
com.khubla.ipdb.db.service.impl.DatabaseAdminServiceImpl.clean(DatabaseAdminServiceImpl.java:50)
at
com.khubla.ipdb.db.service.impl.DatabaseAdminServiceImpl.createDB(DatabaseAdminServiceImpl.java:57)
... 1 more Caused by: com.khubla.ipdb.db.DAOException: Exception in
deleteAll at
com.khubla.ipdb.db.GenericRelationalDAO.deleteAll(GenericRelationalDAO.java:80)
at
com.khubla.ipdb.db.service.impl.DatabaseAdminServiceImpl.clean(DatabaseAdminServiceImpl.java:41)
... 2 more Caused by: jakarta.persistence.PersistenceException:
java.lang.IllegalStateException: Unable to determine the appropriate
ebean platform given database product name [mysql] and ebean platform
providers [H2]. With ebean 13+ we now have separate platforms
(ebean-postgres, ebean-mysql etc) and should use database specific
platform dependency like ebean-postgres. Note that we can use
ebean-platform-all to include all the platforms. at
io.ebeaninternal.server.core.DatabasePlatformFactory.create(DatabasePlatformFactory.java:58)
at
io.ebeaninternal.server.core.DefaultContainer.setDatabasePlatform(DefaultContainer.java:219)
at
io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:109)
at
io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:33)
at io.ebean.DatabaseFactory.createInternal(DatabaseFactory.java:135)
at io.ebean.DatabaseFactory.create(DatabaseFactory.java:84) at
com.khubla.ipdb.db.DBUtil.(DBUtil.java:74) at
com.khubla.ipdb.db.DBUtil.getInstance(DBUtil.java:107) at
com.khubla.ipdb.db.GenericRelationalDAO.deleteAll(GenericRelationalDAO.java:77)
... 3 more Caused by: java.lang.IllegalStateException: Unable to
determine the appropriate ebean platform given database product name
[mysql] and ebean platform providers [H2]. With ebean 13+ we now have
separate platforms (ebean-postgres, ebean-mysql etc) and should use
database specific platform dependency like ebean-postgres. Note that
we can use ebean-platform-all to include all the platforms. at
io.ebeaninternal.server.core.DatabasePlatformFactory.byDatabaseMeta(DatabasePlatformFactory.java:104)
at
io.ebeaninternal.server.core.DatabasePlatformFactory.byDataSource(DatabasePlatformFactory.java:80)
at
io.ebeaninternal.server.core.DatabasePlatformFactory.create(DatabasePlatformFactory.java:55)
... 11 more
# 解决方案 针对这个问题,按以下步骤排查和解决: ## 1. 严格对齐依赖版本 确保`ebean-platform-all`(或单独的`ebean-mysql`)的版本和核心`io.ebean.ebean`版本完全一致(即13.25.2-jakarta)。版本不匹配是最常见的原因,会导致Ebean无法识别加载对应的平台实现类。 比如Maven依赖配置: ```xml <!-- 核心依赖 --> <dependency> <groupId>io.ebean</groupId> <artifactId>ebean</artifactId> <version>13.25.2-jakarta</version> </dependency> <!-- MySQL平台依赖 --> <dependency> <groupId>io.ebean</groupId> <artifactId>ebean-mysql</artifactId> <version>13.25.2-jakarta</version> </dependency> <!-- 或者用all包含所有平台 --> <dependency> <groupId>io.ebean</groupId> <artifactId>ebean-platform-all</artifactId> <version>13.25.2-jakarta</version> </dependency>
2. 验证依赖是否被正确引入
通过依赖分析工具确认平台依赖已被加入到最终的部署包中:
- Maven:执行
mvn dependency:tree查看依赖树,确认ebean-mysql或ebean-platform-all存在且无冲突 - Gradle:执行
gradle dependencies检查依赖
如果是打包时排除了该依赖,需要调整打包配置(比如Spring Boot的exclude规则)。
3. 显式指定数据库平台实例
如果自动加载平台失败,直接在代码中实例化MySQL平台类,替代字符串设置:
// 替换原来的dataSourceConfig.setPlatform("mysql"); import io.ebean.platform.mysql.MySqlPlatform; // ... dataSourceConfig.setPlatform(new MySqlPlatform());
这种方式跳过了自动识别逻辑,强制指定使用MySQL平台。
4. 检查生产环境类路径
确保生产环境的运行时类路径中包含ebean-mysql或ebean-platform-all的jar包。比如使用Fat Jar打包时,确认这些依赖被正确打包进去;如果是容器部署,检查镜像或部署包中是否包含这些依赖文件。
5. 确认数据库驱动兼容性
生产环境使用的com.mysql.cj.jdbc.Driver是MySQL 8.x的驱动,和Ebean的MySQL平台是兼容的,但需要确保MySQL服务器版本和驱动版本匹配(比如MySQL 8.x对应驱动8.x)。
内容的提问来源于stack exchange,提问作者tom.everett

