【问题标题】:Setting classpath in NetBeans在 NetBeans 中设置类路径
【发布时间】:2020-01-13 03:40:58
【问题描述】:

我在使用 NetBeans 8.2 时遇到问题:通过 Java 类连接到数据库时,会引发 SQLException,它告诉我缺少驱动程序。事情是这样的:

  1. 通过“服务”选项卡下的选项建立连接时连接正常:

  2. 我已经通过“右键单击项目”> 属性 > 库为 IDE 提供了连接器,如“项目”选项卡中的“库”目录所示:

我尝试使用 -cp 选项编写、编译和运行两个程序,以复制我为项目编写的相同程序的行为,并且一切正常。代码如下:

这个程序连接数据库,并返回连接:

  public Connection connectToDB(String username, String password, String url){
    System.out.println("connecting...");
    try{
      Connection conn = DriverManager.getConnection(url, username, password);
      System.out.println("connection succeded!");
      return conn;
    }catch(SQLException e){
      System.out.println(e.toString());
    }

    return null;
  }
}

这个程序只是测试连接:

public static void main(String args[]){
    String url = "jdbc:mysql://localhost/dbname?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    String username = "usr";
    String password = "password";
    ConnectToDB c = new ConnectToDB();
    Connection conn = c.connectToDB(username, password, url);
}

这是我的项目的完整堆栈跟踪。请注意,在项目中,我通过实例化 ConnectToDB 类并调用方法 connectToDB 来连接到 servlet 中的数据库以进行日志记录,与上面显示的完全相同。我应该检索的数据会进入工厂以供用户等使用,这就是它显示在堆栈跟踪中的原因。

Informazioni:   Loading application [WebProgrammingProject] at [/WebProgrammingProject]
Informazioni:   WebProgrammingProject was successfully deployed in 1.455 milliseconds.
Informazioni:   connecting to database...
Informazioni:   connection failed!
Informazioni:   java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/usr?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Avvertenza:   StandardWrapperValve[Login]: Servlet.service() for servlet Login threw exception
java.lang.NullPointerException
    at model.UtenteFactory.getUsers(UtenteFactory.java:33)
    at control.Login.processRequest(Login.java:38)
    at control.Login.doGet(Login.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:748)

我做错了什么?我错过了什么?

编辑:仅供参考,我试图在我当前的机器上重新安装全部并硬格式化我的硬盘,但它没有用。我重新安装了 Win10、jdk 8、mysql 8.0.17 和 NetBeans 8.2。我还尝试在另外两台机器上运行我的 WebApp(它们都是 Win10 和相同程序的相同版本),但它也不起作用。

编辑:显然我的问题需要对项目结构进行更多解释。

基本上,我必须做一个完整的网站,模拟同行评审期刊,其中包含用户(作者和组织者,让作者发表文章进行评审)、文章和评估。

应用程序本身需要初始化为 Java Web > Web 应用程序,因为我的教授使用某种自定义自动化工具对我的项目进行评分,所以我坚持这样做。

必须通过三个 Java 工厂从数据库中检索数据:一个工厂用于用户,一个工厂用于文章,一个工厂用于评估。工厂从数据库中获取数据,它们的方法(例如通过 id 获取用户、通过日期获取文章等)将检索到的数据返回给在 jsps 上传递它的各种 servlet。

与数据库的连接(我们使用 MySQL)由一个外部 java 类执行,该类连接并返回给请求它一个 Connection 类型对象的工厂。

最后,网络应用依赖 Gliassfish 4.1.1

更新

我设法找到了这个项目的另一个版本,其中包含我为建立连接而编写的另一个程序,并且在一段时间内它工作得很好。太糟糕了,现在它给了我一个 SQLNonTransientConnectionException 异常。

这是暂时起作用的代码:

public class DBConnection {
    private static DBConnection singleton;

    private DBConnection(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException ex){
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE,null,ex);
        }
    }

    public static DBConnection getInstance(){
        if(singleton == null)
        {
            singleton = new DBConnection();
        }
        return singleton;
    }

    public Connection getConnection(){
        Connection conn = null;
        String db = "jdbc:mysql://localhost:3306/dbname?zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&autoReconnect=true&useSSL=false";
        String username = "usr";
        String password = "password";
        try{
            conn = DriverManager.getConnection(db, username, password);
            System.out.println("connection established");
        }catch(SQLException ex){
            System.out.println(ex.toString());
        }

        return conn;
    }
}

这是堆栈跟踪:

Grave:   Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
    Informazioni:   java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    Avvertenza:   StandardWrapperValve[Login]: Servlet.service() for servlet Login threw exception
java.lang.NullPointerException
        at model.UtenteFactory.getUsers(UtenteFactory.java:28)
        at model.UtenteFactory.getUserByEmailAndPassword(UtenteFactory.java:55)
        at controller.Login.processRequest(Login.java:41)
        at controller.Login.doGet(Login.java:68)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
        at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
        at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
        at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
        at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
        at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
        at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
        at java.lang.Thread.run(Thread.java:748)

我很想放弃这一点:没有什么是应有的方式,也没有什么行为可以预测。为什么它工作了一段时间,现在却没有?我很困惑

【问题讨论】:

  • stackoverflow 搜索 classpath NetBeans 没帮到你?
  • 很遗憾,没有,因为每个人都通过转到项目、库、编译选项卡和添加 jar 文件来解决他们的问题
  • 请提供完整的异常堆栈跟踪,显示的代码不会产生驱动丢失的错误,这意味着您在解释事情,这可以隐藏问题。
  • @MarkRotteveel 确定。刚刚做到了
  • [1] 您认为您在应用程序中使用的驱动程序的确切名称是什么? [2] MySQL 的确切版本是什么?

标签: java mysql jdbc netbeans classpath


【解决方案1】:

我认为问题在于您在编译选项卡上的配置。试试这个更简单的方法:

  1. {Project properties} > Libraries > Compile,然后删除屏幕截图上 Compile 选项卡中显示的现有条目。

  2. {Project properties} > Libraries > Compile > Add JAR/Folder,然后导航到 mysql-connector-java-8.0.17.jar 的实例。单击Open,这将在Compile 选项卡上创建一个新条目,并将Connector/J 驱动程序复制到项目的lib 目录中。在我的例子中,Compile 标签看起来像这样:

  3. 清理并构建项目。这应该在您的 jar 文件中的 META-INF/MANIFEST.MF 中创建一个条目,如下所示:Class-Path: lib/mysql-connector-java-8.0.17.jar

运行应用程序,驱动程序将在您项目的 lib 目录中找到。在一个简单的 Java 应用程序中与 MySQL 建立 JDBC 连接时,我刚刚验证了它在 NB 8.2 上对我有用。如果您在执行 Build 时提交 Output 窗口中显示的命令,它也可以在从命令行运行时工作。就我而言,该命令如下所示:

要在没有 Ant 的情况下从命令行运行此应用程序,请尝试:

java -jar "D:\NB82\JdbcSelectTest\dist\JdbcSelectTest.jar"

但是,如果您想从任意位置运行您的 jar 文件 - 例如,在另一台机器上 - 您需要确保 mysql-connector-java-8.0.17.jar 保持不变使用 -cp 选项在您的类路径上。

【讨论】:

  • 好的,我删除了之前的条目,现在我的编译选项卡看起来像this。 NetBeans 自动管理连接器的副本和我的 lib 目录(假设您指的是this lib 目录:我的项目文件夹中没有)。遗憾的是,清理和构建没有更新 manifest.mf:它仍然没有显示您提到的条目,如您所见 here。此外,我的输出窗口可能看起来与您的不同。 Here it is
  • @mootasa 好的,显然您的项目不是一个简单的 Java Ant 应用程序,因为您的项目属性的 Categories 与我的屏幕截图中显示的非常不同。你能用问题的实际项目的更多细节更新你的问题,以便其他人可以尝试重现它吗?也就是说,您仍然应该能够使用我的答案中的方法创建一个连接到 MySQL 的简单 Java 项目(File > New Project...> Java > Java Application)。那样有用吗?但至少将驱动程序添加到项目的 lib 目录中看起来不错。
  • 好的,我更新了我原来的帖子。希望我提供了足够的信息。此外,我尝试通过新建项目 > java > java 应用程序创建另一个项目,一切正常:我可以检索数据并将其插入到我的数据库中
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多