Eclipse抛出“java.lang.ClassNotFoundException: org.postgresql.Driver”异常,尽管我已将JDBC驱动程序放在项目的类路径[重复]中

Eclipse throws "java.lang.ClassNotFoundException: org.postgresql.Driver" exception, although I have put the JDBC driver in project's classpath [duplicate]

提问人:George Charitakis 提问时间:11/15/2023 更新时间:11/16/2023 访问量:44

问:

我正在使用 JDBC 和 Eclipse 为一个大学项目构建一个登录系统,IDE.As GUI 有两个用于用户名和密码的文本字段以及一个登录按钮。为此,我创建了一个名为 BDConnection 的类,该类与数据库进行连接,其代码如下:

package application;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {

    private static final String username = "username";
    private static final String password = "password";
    private static final String url = "jdbc:postgresql://dbname";
    
     static Connection getConnection() {
        Connection con = null;
        
        try {
            
            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection(url,username,password);
            
        }catch(SQLException eSQL) {
            eSQL.printStackTrace();
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        return con;
    }
}

另外,由于我使用 JavaFX,因此我创建了另一个类 LoginSignUpController,它包含登录按钮侦听的方法:

package application;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;

public class LoginSignUpController {

    
    @FXML
    TextField usernameTxtField;
    
    @FXML
    PasswordField PasswdTxtFiled;
    
    private PreparedStatement prepStmnt;
    private ResultSet rs;
    
    
    public void login(ActionEvent e) {
        
        String user = usernameTxtField.getText();
        String passwd = PasswdTxtFiled.getText();
        String query = "SELECT * FROM USERS WHERE USERNAME=? AND PASSWD=?";
        
        
        try {
            prepStmnt = DBConnection.getConnection().prepareStatement(query);   
            
            prepStmnt.setString(1, user);
            prepStmnt.setString(2, passwd);

            rs = prepStmnt.executeQuery();
            
            if(rs.next()) {
                System.out.println("User found");
            }else {
                System.out.println("User not found");
            }
            
            rs.close();
            prepStmnt.close();
            
        } catch (SQLException e1) {
            e1.printStackTrace();
        }catch(NullPointerException e2) {
            e2.printStackTrace();
        }
            
    }
    
}

应用程序一直向我抛出“java.lang.ClassNotFoundException: org.postgresql.Driver”,尽管我在类路径中添加了 JDBC 驱动程序。我还尝试在模块路径中添加外部jar,但仍然一无所获。可能是什么问题?

java sql postgresql javafx jdbc

评论

1赞 jewelsea 11/15/2023
“我还尝试在模块路径中添加外部 jar,但仍然没有” -> Postgres 驱动程序不是模块化的(至少我上次检查时),它可能无法在模块路径上正常工作。它可能作为一个自动模块工作,但我不知道这对驱动程序来说是否能得到保证。对于依赖于非完整模块(包含类)的软件的 JavaFX 项目,我建议使用非模块化设置,如 openjfx.io 中所述。module-info
0赞 jewelsea 11/15/2023
我不知道转换为非模块化项目将修复(或需要修复)您当前的错误配置和 postgres 驱动程序类访问问题。
1赞 jewelsea 11/15/2023
来自 Postgres 文档:“在 Java 1.6 之前,驱动程序必须由应用程序加载:通过调用或......这些加载驱动程序的旧方法仍然受支持,但不再需要它们。该调用是反射调用,在模块化环境中受到限制,除非模块显式设计为对反射开放。我不建议在驱动程序上使用反射。Class.forName("org.postgresql.Driver");forName
0赞 David Weber 11/15/2023
请提供堆栈跟踪。
1赞 Mark Rotteveel 11/15/2023
您可能已将其放在项目类路径中,但它是否位于运行时类路径中?

答:

0赞 David Weber 11/16/2023 #1

仅针对其他人:解决方案是将外部 JAR 添加到运行时类路径中,而不仅仅是项目类路径中。

“你可能已经把它放在你的项目类路径上,但它是否放在你的 运行时类路径?“——马克·罗特维尔