SpringBoot项目集成JT400连接AS400 DB2找不到JDBC驱动问题
可能的原因及对应排查方案:
- 类加载器隔离问题
Spring Boot 多数据源场景、启用DevTools、使用自定义类加载器、或者跑在嵌入式容器中时,Class.forName()默认使用的调用方类加载器和加载依赖包的类加载器可能不是同一个,会出现明明jar包存在却找不到类的情况。
可尝试指定类加载器加载驱动类验证:
Class.forName("com.ibm.as400.access.AS400JDBCDriver", true, 你的项目启动类.class.getClassLoader());
如果能正常加载,说明是类加载器上下文切换导致的问题,后续手动注册驱动时指定对应类加载器即可。
- 依赖排除规则误过滤
你项目中已经引入了IBM官方DB2的jcc驱动,如果你的build.gradle中配置了全局的exclude group: 'com.ibm'这类规则,会将com.ibm.as400开头的JT400类也一并排除。
可执行以下命令确认依赖是否被正常引入:
./gradlew dependencies --configuration runtimeClasspath | grep jt400
如果返回为空,检查所有全局排除规则,添加针对JT400的豁免规则即可。
SPI配置被覆盖
JDBC 4.0以上版本通过SPI机制自动扫描META-INF/services/java.sql.Driver文件注册驱动,如果你使用了ShadowJar等合并Jar的打包插件,多个JDBC驱动的同名配置文件可能被覆盖,导致JT400的驱动没有被注册。
可解压打包后的Spring Boot Jar,检查BOOT-INF/lib下是否存在jt400的Jar包,或合并后的META-INF/services/java.sql.Driver文件中是否存在com.ibm.as400.access.AS400JDBCDriver条目。如果缺失可手动配置打包合并规则,保留所有驱动的SPI配置。JDK版本不匹配
JT400 10.6版本最低要求JDK 8运行环境,如果你的项目sourceCompatibility、targetCompatibility配置低于1.8,或者运行时使用的JDK版本低于8,会导致类加载时被JVM拒绝,抛出类未找到异常。
可对比项目运行JDK版本和JT400官方要求的最低版本,确认版本匹配。连接配置错误
确认AS400的JDBC连接URL格式符合JT400要求,正确格式为jdbc:as400://<AS400服务器地址>/<默认库名>,如果URL前缀写错,JDBC DriverManager无法匹配到对应驱动,会抛出"No suitable driver found"错误。
内容的提问来源于stack exchange,提问作者Paul

