Java 在NetBeans中设置类路径

Java 在NetBeans中设置类路径,java,mysql,jdbc,netbeans,classpath,Java,Mysql,Jdbc,Netbeans,Classpath,我对NetBeans 8.2有一个问题:当通过Java类连接到数据库时,会引发SQLException,它告诉我缺少驱动程序。问题是: 通过“服务”选项卡下的选项建立连接时,连接正常: 我已经通过“右键单击项目”>properties>libraries为IDE提供了连接器,如项目选项卡中的my libraries目录所示: 我试着用-cp选项编写、编译和运行两个程序,以复制我为我的项目编写的相同程序的行为,一切正常。代码如下: 此程序连接到数据库,并返回连接: public Conne

我对NetBeans 8.2有一个问题:当通过Java类连接到数据库时,会引发SQLException,它告诉我缺少驱动程序。问题是:

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

  • 我已经通过“右键单击项目”>properties>libraries为IDE提供了连接器,如项目选项卡中的my libraries目录所示:

  • 我试着用-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);
    }
    
    此程序仅测试连接:

      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中的数据库以进行日志记录,方法与我上面所示的完全相同。我应该检索的数据进入工厂供用户使用,这就是为什么它会显示在stacktrace中

    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和相同程序的相同版本),但也不起作用

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

    基本上,我必须做一个完整的网站,模拟同行评议杂志,其中包含用户(给作者文章进行评议的作者和组织者)、文章和评价

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

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

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

    最后,该web应用程序依赖于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;
        }
    }
    
    这是stacktrace:

    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)
    

    我真的迫不及待地要放弃这一点:没有什么是它应该的样子,没有什么是可以预测的。为什么它工作了一段时间而现在没有?我感到困惑

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

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

  • {Project properties}>Libraries>Compile>addjar/Folder,然后导航到mysql-connector-java-8.0.17.JAR的实例。单击打开,这将在编译选项卡上创建一个新条目,并将连接器/J驱动程序复制到项目的目录中。在我的例子中,编译选项卡如下所示:

  • 清洁和建设项目。这应该在jar文件的META-INF/MANIFEST.MF中创建一个如下所示的条目:
    类路径:lib/mysql-connector-java-8.0.17.jar

  • 运行应用程序,驱动程序将在项目的lib目录中找到。在一个简单的Java应用程序中建立到MySQL的JDBC连接时,我刚刚在NB8.2上验证了这一点。如果在执行构建时提交输出窗口中显示的命令,则从命令行运行时,该命令也会起作用。在我的例子中,该命令如下所示:

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

    java-jar“D:\NB82\jdbselecttest\dist\jdbselecttest.jar”


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

    堆栈溢出搜索没有帮到您?遗憾的是,没有,因为每个人都通过使用project、libraries、compile选项卡和add jar文件解决了他们的问题。请提供完整的异常stacktrace,显示的代码不会产生驱动程序丢失的错误,这意味着您正在解释一些内容,这可能会隐藏问题。@markrotVeel确实如此。刚刚完成[1]您认为在应用程序中使用的驱动程序的确切名称是什么?[2] MySQL的确切版本是什么?好的,我删除了前面的条目,现在我的编译选项卡看起来像。NetBeans自动管理连接器和我的lib目录的副本(假设您指的是lib目录:我的项目文件夹中没有)。遗憾的是,清理和构建没有更新manifest.mf:正如您所看到的,它仍然没有显示您提到的条目。此外,我的输出窗口可能与您的不同@mootasa好的,很明显,您的项目不是一个简单的JavaAnt应用程序,因为您项目的属性类别与我的屏幕截图中显示的属性类别非常不同。你能更新你的问题吗