升级spring-boot-starter-parent至2.6.14后JBOSS部署遇CannotGetJdbcConnectionException
升级Spring Boot Parent至2.6.14后JBOSS部署时Oracle驱动加载失败
问题现象
将spring-boot-starter-parent版本升级至2.6.14后,本地代码运行正常,但部署到JBOSS服务器时抛出如下异常:Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Unable to load class: oracle.jdbc.OracleDriver from ClassLoader:ModuleClassLoader for Module "deployment.xyz.war"
异常堆栈信息:
org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Unable to load class: oracle.jdbc.OracleDriver from ClassLoader:ModuleClassLoader for Module "deployment.xyz.war" from Service Module Loader;ClassLoader:ModuleClassLoader for Module "deployment.xyz.war" from Service Module Loader 2023-05-08 06:17:46,741 INFO [stdout] (default task-1) at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:83) ~[spring-jdbc-5.3.24.jar:5.3.24] 2023-05-08 06:17:46,741 INFO [stdout] (default task-1) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:646) ~[spring-jdbc-5.3.24.jar:5.3.24] 2023-05-08 06:17:46,742 INFO [stdout] (default task-1) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713) ~[spring-jdbc-5.3.24.jar:5.3.24] 2023-05-08 06:17:46,742 INFO [stdout] (default task-1) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:744) ~[spring-jdbc-5.3.24.jar:5.3.24] 2023-05-08 06:17:46,742 INFO [stdout] (default task-1) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:757) ~[spring-jdbc-5.3.24.jar:5.3.24]
环境信息
- Java版本:
1.8.0_222 - JBOSS版本:
7.2 - spring-jdbc版本:
spring-jdbc-5.3.24
解决方案
1. 检查Oracle驱动依赖配置
确保项目中ojdbc依赖未被设置为provided(若需将驱动打包到war包中),Maven依赖示例:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> <!-- 若依赖设为provided,需确保JBOSS模块中已配置驱动 --> </dependency>
2. 配置JBOSS模块引用(驱动放在JBOSS模块时)
如果Oracle驱动部署在JBOSS的模块目录中,需在项目WEB-INF/jboss-deployment-structure.xml中添加模块依赖:
<jboss-deployment-structure> <deployment> <dependencies> <module name="com.oracle.ojdbc" slot="main"/> </dependencies> </deployment> </jboss-deployment-structure>
同时确保JBOSS的modules/com/oracle/ojdbc/main目录下存在驱动jar和module.xml,module.xml示例:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.oracle.ojdbc"> <resources> <resource-root path="ojdbc8.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
3. 调整类加载策略
在项目的application.properties中明确指定驱动类名:
spring.jdbc.driver-class-name=oracle.jdbc.OracleDriver
若仍有问题,可在WEB-INF/jboss-web.xml中设置类加载优先级:
<jboss-web> <class-loading> <class-loader> <priority>1</priority> </class-loader> </class-loading> </jboss-web>
4. 确认驱动类名正确性
Oracle 11g及更早版本驱动类名为oracle.jdbc.driver.OracleDriver,12c及以上版本为oracle.jdbc.OracleDriver,需根据使用的驱动版本匹配正确的类名。
内容的提问来源于stack exchange,提问作者Saqib Ahmed
相关产品推荐
相关产品推荐

