如何在Java项目中正确引入并使用PostgreSQL JDBC驱动
Java连接PostgreSQL时出现ClassNotFoundException,原因是JVM未包含驱动JAR。三种解决方法:手动指定classpath(如使用-cp参数);使用Mavenexec插件运行;或构建包含所有依赖的可执行JAR。此外,对于JDBC4.0及以上版本,可省略Class.forName语句,但需确保驱动位于类路径中。该错误常见于未正确
本文详解 Ja va 初学者如何解决 ClassNotFoundException: org.postgresql.Driver 错误,涵盖 Ma ven 依赖配置、类路径(classpath)原理、三种可靠运行方式(Ma ven 执行、显式 -cp 指定、可执行 JAR 构建),并提供完整可运行示例。
Ja va 程序连接 PostgreSQL 时,ja va.lang.ClassNotFoundException: org.postgresql.Driver 这个错误,几乎每个刚入门的开发者都会撞上。表面上看是驱动没下载,但真相是:运行时 JVM 压根不知道驱动在哪——即便你早已用 Ma ven 把依赖拉到了本地仓库。Ma ven 只在编译、测试、打包阶段自动管理 classpath,它不会干预你直接敲 ja va Main 时的那套路径规则。默认情况下,JVM 的 classpath 仅包含当前目录(.),所以尽管 postgresql-42.2.23.jar 静静地躺在 ~/.m2/repository/ 里,ja va 命令却视而不见。
正确做法:三选一(推荐使用方案 B)
方案 A:手动指定 classpath(适合快速验证)
先确保你的 Main.class 已经编译好(比如通过 mvn compile 生成在 target/classes/ 下),然后用 -cp 参数把依赖和编译类一起告诉 JVM:
# Linux/macOS(注意路径分隔符为 :) ja va -cp "target/classes:~/.m2/repository/org/postgresql/postgresql/42.2.23/postgresql-42.2.23.jar" Main # Windows(分隔符为 ;) ja va -cp "target\classes;C:\Users\YourName\.m2\repository\org\postgresql\postgresql\42.2.23\postgresql-42.2.23.jar" Main
注意:
-cp中必须同时包含你的编译类(target/classes)和 PostgreSQL JAR;路径需严格准确,建议用ls或资源管理器确认 JAR 文件真实存在。
方案 B:用 Ma ven 运行(推荐!简洁可靠)
在 pom.xml 里添加 ma ven-exec-plugin 插件,声明主类:
org.codehaus.mojo exec-ma ven-plugin 3.1.0 Main
之后只需一条命令,Ma ven 会自动把所有依赖塞进 classpath:
mvn exec:ja va
方案 C:构建可执行 JAR(适合分发)
用 ma ven-assembly-plugin 把依赖和代码打包成一个 fat JAR:
org.apache.ma ven.plugins ma ven-assembly-plugin 3.6.0 jar-with-dependencies Main make-assembly package single
执行 mvn clean package 后,在 target/ 目录下找到形如 library-app-1-jar-with-dependencies.jar 的文件,直接运行:
ja va -jar target/library-app-1-jar-with-dependencies.jar
补充:代码优化建议
你的 connect() 方法中 Class.forName(...) 在现代 JDBC(4.0+)中已经非必需——驱动会自动注册。更健壮的写法可以直接去掉这行:
public Connection connect() {
if (connection == null) {
try {
// 自动加载驱动(JDBC 4.0+ 规范)
connection = DriverManager.getConnection(url, username, password);
System.out.println("Dev db connection established");
} catch (SQLException e) {
System.err.println("Database connection failed: " + e.getMessage());
e.printStackTrace();
}
}
return connection;
}
总结
-
mvn install≠ “安装到 Ja va 环境”,它只把依赖存入本地仓库,并不修改系统级 classpath; - 运行 Ja va 程序时,classpath 必须显式包含所有依赖 JAR;
- 对 Ma ven 项目,优先使用
mvn exec:ja va或构建 fat JAR,避免手动管理路径; - 确保
pom.xml中 groupId/artifactId 与实际包结构一致(如Main.ja va在src/main/ja va/Main.ja va,则主类应为Main;若在src/main/ja va/com/example/Main.ja va,则应为com.example.Main)。
完成任一方案后,System.out.println("Started..."); 即可正常输出,PostgreSQL 连接也将成功建立。
