
本文详解 Java 初学者如何解决 ClassNotFoundException: org.postgresql.Driver 错误,涵盖 Maven 依赖配置、类路径(classpath)原理、三种可靠运行方式(Maven 执行、显式 -cp 指定、可执行 JAR 构建),并提供完整可运行示例。
本文详解 java 初学者如何解决 `classnotfoundexception: org.postgresql.driver` 错误,涵盖 maven 依赖配置、类路径(classpath)原理、三种可靠运行方式(maven 执行、显式 `-cp` 指定、可执行 jar 构建),并提供完整可运行示例。
Java 程序连接 PostgreSQL 数据库时抛出 java.lang.ClassNotFoundException: org.postgresql.Driver,根本原因不是驱动没下载,而是运行时 JVM 找不到该类。你已用 Maven 成功下载了 postgresql-42.2.23.jar(默认存于 ~/.m2/repository/org/postgresql/postgresql/42.2.23/),但直接执行 java Main 时,JVM 的 classpath 仅包含当前目录(.),完全不包含 Maven 下载的任何依赖——Maven 只在编译、测试、打包阶段自动管理 classpath,不会干预 java 命令的运行环境。
✅ 正确做法:三选一(推荐使用方案 B)
✅ 方案 A:手动指定 classpath(适合快速验证)
确保你的 Main.class 已编译(如通过 mvn compile 生成于 target/classes/),然后使用 -cp 显式添加所有依赖:
# Linux/macOS(注意路径分隔符为 :) java -cp "target/classes:~/.m2/repository/org/postgresql/postgresql/42.2.23/postgresql-42.2.23.jar" Main # Windows(分隔符为 ;) java -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:用 Maven 运行(推荐!简洁可靠)
在 pom.xml 中添加 maven-exec-plugin 插件,声明主类(<mainClass>):
立即学习“Java免费学习笔记(深入)”;
<build>
<plugins>
<!-- 其他插件(如 compiler)保持不变 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>Main</mainClass> <!-- 替换为你的主类全限定名,如 com.example.Main -->
</configuration>
</plugin>
</plugins>
</build>之后只需一条命令即可运行(Maven 自动将所有依赖加入 classpath):
mvn exec:java
✅ 方案 C:构建可执行 JAR(适合分发)
使用 maven-assembly-plugin 将依赖打包进单个 JAR(“fat JAR”):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>执行 mvn clean package 后,在 target/ 目录下找到形如 library-app-1-jar-with-dependencies.jar 的文件,直接运行:
java -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 ≠ “安装到 Java 环境”,它只把依赖存入本地仓库,并不修改系统级 classpath;
- ✅ 运行 Java 程序时,classpath 必须显式包含所有依赖 JAR;
- ✅ 对 Maven 项目,优先使用 mvn exec:java 或构建 fat JAR,避免手动管理路径;
- ✅ 确保 pom.xml 中 groupId/artifactId 与实际包结构一致(如 Main.java 在 src/main/java/Main.java,则主类应为 Main;若在 src/main/java/com/example/Main.java,则 <mainClass> 应为 com.example.Main)。
完成任一方案后,System.out.println("Started..."); 即可正常输出,PostgreSQL 连接也将成功建立。



















