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

Spring Boot项目打包War部署Tomcat时PostgreSQL驱动找不到异常

解决Spring Boot War部署到Tomcat后找不到PostgreSQL驱动的问题

你遇到的是典型的JDBC驱动未被正确包含或加载的问题——本地运行正常是因为Spring Boot内嵌Tomcat会自动处理依赖,但打包成War部署到独立Tomcat时,类加载环境发生了变化。下面是几个针对性的解决方案:

1. 修正PostgreSQL驱动的依赖范围

本地运行时,Spring Boot的内嵌容器会将驱动包纳入类路径,但如果你在Maven/Gradle中把驱动的依赖范围设为provided,打包War时这个驱动不会被包含进去,而独立Tomcat默认又没有PostgreSQL驱动。

Maven配置示例:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <!-- 移除<scope>provided</scope>,使用默认的compile范围 -->
</dependency>

Gradle配置示例:

implementation 'org.postgresql:postgresql'
// 不要用compileOnly,确保驱动被打包进WEB-INF/lib

这样打包后的War文件里,WEB-INF/lib目录下会包含PostgreSQL的驱动jar包,Tomcat就能找到它了。

2. 显式加载驱动类(可选,解决类加载器异常)

JDBC 4.0+理论上会自动注册驱动,但在Tomcat的类加载层级下,有时候自动注册不生效。你可以在获取数据库连接前手动加载驱动类:

// 在你的Database类的getUnusedProfileAndMarkAsUsed方法开头添加
try {
    Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
    throw new RuntimeException("PostgreSQL驱动类未找到", e);
}

不过更推荐使用Spring Boot的DataSource抽象(比如JdbcTemplate或者Spring Data JPA),而不是直接用DriverManager,Spring会帮你自动处理驱动加载和连接池管理,减少这类问题。

3. 检查Tomcat全局类加载的冲突(若手动放置了驱动)

如果你为了多个应用共享驱动,把PostgreSQL驱动放到了TOMCAT_HOME/lib目录下,那要注意两点:

  • 确保驱动版本和项目依赖的版本完全一致,避免类版本冲突
  • 项目中的驱动依赖必须设为provided,防止War包中的驱动和全局驱动冲突

不过一般不推荐这种方式,每个应用独立打包驱动会更稳定。

4. 验证JDBC连接的可达性

虽然本地正常,但部署到Tomcat后,要确认Tomcat服务器能访问到PostgreSQL实例:

  • 检查jdbc:postgresql://myip:5432/mydb中的IP、端口、数据库名是否正确
  • 确认PostgreSQL服务器的防火墙开放了5432端口,Tomcat服务器能ping通PostgreSQL主机
  • 确认数据库账号密码在生产环境中配置正确(比如有没有配置到application.properties或环境变量里)

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:06