繁体   English   中英

在NetBeans中设置类路径

[英]Setting classpath in NetBeans

我在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中的数据库以进行记录,方法与上面显示的完全相同。 我应该检索的数据将进入工厂供用户使用,这就是为什么它在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。 我还尝试在另外两台计算机(两者均为Win10和相同程序的相同版本)中运行我的WebApp,但两者均不起作用。

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

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

该应用程序本身需要初始化为Java Web> Web应用程序,因为我的教授使用某种自定义的自动化工具来对我的项目进行评分,因此我对此感到困惑。

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

与数据库的连接(我们使用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;
    }
}

这是堆栈跟踪:

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)

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

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

  1. {项目属性}>库>编译 ,然后删除屏幕快照“ 编译”选项卡中显示的现有条目。

  2. {项目属性}>库>编译>添加JAR / Folder ,然后导航到mysql-connector-java-8.0.17.jar的实例 单击“ 打开” ,这将在“ 编译”选项卡上创建一个新条目,然后将Connector / J驱动程序复制到项目的lib目录中。 在我的情况下,“ 编译”选项卡如下所示:

    ConnectorJ驱动程序

  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文件,则需要使用-cp选项确保mysql-connector-java-8.0.17.jar保留在类路径中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM