java.lang.ClassNotFoundException:使用 Maven 依赖项时的 oracle.jdbc.OracleDriver

Posted

技术标签:

【中文标题】java.lang.ClassNotFoundException:使用 Maven 依赖项时的 oracle.jdbc.OracleDriver【英文标题】:java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver when using Maven Dependency 【发布时间】:2020-04-29 00:08:34 【问题描述】:
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>7.0.47</version>
        </dependency>

以上是我正在使用的 maven 依赖项。

    PoolProperties p = new PoolProperties();

    p.setUrl("jdbc:oracle:thin:@//ip:port:ora11g");
    p.setDriverClassName("oracle.jdbc.OracleDriver");
    p.setUsername("un");
    p.setPassword("pw");
    p.setJmxEnabled(true);
    p.setTestWhileIdle(false);
    p.setTestOnBorrow(true);
    p.setValidationQuery("SELECT 1");
    p.setTestOnReturn(false);
    p.setValidationInterval(30000);
    p.setTimeBetweenEvictionRunsMillis(30000);
    p.setMaxActive(100);
    p.setInitialSize(10);
    p.setMaxWait(10000);
    p.setRemoveAbandonedTimeout(60);
    p.setMinEvictableIdleTimeMillis(30000);
    p.setMinIdle(10);
    p.setLogAbandoned(true);
    p.setRemoveAbandoned(true);
    p.setJdbcInterceptors(
            "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
                    "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
    DataSource datasource = new DataSource();
    datasource.setPoolProperties(p);

    Connection con = null;
    try 
        con = datasource.getConnection();
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery("select * from user");
        int cnt = 1;
        while (rs.next()) 
            System.out.println((cnt++)+". Host:" +rs.getString("Host")+
                    " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
        
        rs.close();
        st.close();
     finally 
        if (con!=null) try con.close();catch (Exception ignore) 
    

以上是我的数据库查询测试代码sn-p。

当我执行程序时,出现“java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver”异常。

我搜索了这个问题并读到我必须“确保 oracle jdbc jar 在类路径中”。我不知道为什么我必须手动设置它或者它实际上是必需的。

【问题讨论】:

是的,它是必需的。如果没有驱动程序,您将无法连接到数据库。驱动程序是知道如何与数据库通信的代码,因为每个数据库都有自己的网络协议、类型等。 为什么你认为tomcat-jdbc依赖会给你Oracle驱动?您还需要添加 Oracle JDBC 驱动程序的依赖项。 @Aki T 检查我的答案。 【参考方案1】:

使用下面的依赖

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>

并使用以下代码连接您的 oracle 数据库。

Class.forName("oracle.jdbc.OracleDriver");

String dbURL1 = "jdbc:oracle:thin:USER/PASSWORD@URL:PORT:DBNAME";
//e.g. String dbURL1 = "jdbc:oracle:thin:tiger/scott@localhost:1521:productDB";
Connection  conn1 = DriverManager.getConnection(dbURL1);
if (conn1 != null) 
    System.out.println("Connected with connection #1");

【讨论】:

他为什么要连接那个代码?使用 DriverManager 而不是像 OP 在他的代码中那样使用 DataSource 在 Web 应用程序中是一个糟糕的选择【参考方案2】:

我通过将相应的 ojdbc.jar 添加到项目中解决了这个问题。

也可以通过添加提到的maven依赖来解决(Joy提到的)。

【讨论】:

【参考方案3】:

请注意,您可以从central maven 下载 19.3 JDBC 驱动程序

【讨论】:

以上是关于java.lang.ClassNotFoundException:使用 Maven 依赖项时的 oracle.jdbc.OracleDriver的主要内容,如果未能解决你的问题,请参考以下文章