如何在Java项目中正确引入并使用PostgreSQL JDBC驱动

作者:技术拾光时间:2026-07-12 08:06:11浏览:82

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 连接也将成功建立。