Tomcat部署Maven WebApp时出现ojdbc驱动找不到问题求助
问题描述
我有一个基于Maven构建的Java Web应用,部署在Tomcat 11服务器上,使用HttpServlet和JSP技术。功能是从Oracle 19c数据库获取数据,生成年度统计信息的对象列表,再通过Servlet传递给JSP页面以表格形式展示。
使用NetBeans开发时,带main方法的测试类能正常连接数据库,且pom.xml已添加ojdbc11依赖,但打包WAR部署到Tomcat后出现错误:
No suitable driver found for jdbc:oracle:thin:@localhost:1521/SKI_SCHOOL
附上pom.xml代码:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cc_internship</groupId> <artifactId>SkiSchoolReportWebApp</artifactId> <version>1.0</version> <packaging>war</packaging> <name>SkiSchoolReportWebApp Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>23.5.0.24.07</version> </dependency> </dependencies> <build> <finalName>SkiSchoolReportWebApp</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.4.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.3.0</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>3.1.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
解决方案
1. 验证WAR包是否包含驱动
解压生成的SkiSchoolReportWebApp.war,检查WEB-INF/lib目录下是否存在ojdbc11-23.5.0.24.07.jar:
- 若不存在,执行Maven清理构建命令重新打包:
或在NetBeans中右键项目选择Clean and Build,清理缓存后重新生成WAR。mvn clean package
2. 显式注册JDBC驱动
Web容器的类加载隔离可能导致驱动无法自动注册,在数据库连接代码中添加显式注册逻辑:
try { Class.forName("oracle.jdbc.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 后续获取数据库连接 Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
3. 修正Java版本兼容性
Tomcat 11要求运行环境为Java 17及以上,但你的pom.xml编译版本为Java 8,可能引发类加载问题:
修改pom.xml的编译版本配置:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties>
确保开发环境和Tomcat运行环境均使用Java 17。
4. 全局部署驱动(备选)
若以上方法无效,可将ojdbc11-23.5.0.24.07.jar复制到Tomcat安装目录的lib文件夹,重启Tomcat。此方式让驱动被Tomcat全局类加载器加载,但会导致版本耦合,仅作为临时验证方案。
内容的提问来源于stack exchange,提问作者Thinchance




