如何让MyBatis兼容Jakarta?适配Guice 7.0.0版本问题咨询
解决Guice 7.0.0(Jakarta)与MyBatis的兼容问题
针对你升级Guice到7.0.0后遇到的Jakarta与javax依赖冲突问题,有以下几种可行方案:
1. 升级MyBatis Guice模块到Jakarta兼容版本
MyBatis官方的guice绑定模块(org.mybatis:mybatis-guice)已在较新版本中完成Jakarta API迁移。直接升级该依赖到4.3.0及以上版本即可,这些版本已将所有javax.inject相关引用替换为jakarta.inject,完全适配Guice 7.0.0的Jakarta生态。
修改Maven依赖配置示例:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-guice</artifactId> <version>4.3.0</version> <!-- 或更高稳定版本 --> </dependency>
2. 引入Jakarta与javax的桥接依赖
如果暂时无法升级mybatis-guice模块,可通过Jakarta官方桥接包让旧的javax.inject类自动映射到Jakarta实现。添加以下依赖到项目中:
<dependency> <groupId>jakarta.inject</groupId> <artifactId>jakarta.inject-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> <scope>provided</scope> </dependency>
该方案通过类加载优先级,让javax.inject.Provider的调用实际指向jakarta.inject.Provider实现,消除依赖冲突。
3. 自定义适配模块(兜底方案)
若前两种方案无法满足需求,可自定义适配模块,重写MyBatisModule中依赖javax.inject.Provider的逻辑,替换为Guice 7.0.0兼容的jakarta.inject.Provider或com.google.inject.Provider:
public class JakartaMyBatisModule extends MyBatisModule { @Override protected void initialize() { super.initialize(); // 替换MyBatis组件的Provider绑定 bindSqlSessionFactoryProvider(); // 根据实际使用场景补充其他组件的绑定替换 } private void bindSqlSessionFactoryProvider() { bind(SqlSessionFactory.class).toProvider(SqlSessionFactoryProvider.class); } static class SqlSessionFactoryProvider implements com.google.inject.Provider<SqlSessionFactory> { @Inject private Configuration configuration; @Override public SqlSessionFactory get() { return configuration.buildSqlSessionFactory(); } } }
通过这种方式可逐步替换旧API依赖,实现与Guice 7.0.0的兼容。
内容的提问来源于stack exchange,提问作者Sergey Stepin
相关产品推荐
相关产品推荐

