You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:05:59