【问题标题】:"No suitable driver found..." with Derby 10.15.1.3 under Java 8在 Java 8 下使用 Derby 10.15.1.3 “找不到合适的驱动程序...”
【发布时间】:2019-11-12 08:25:38
【问题描述】:

我正在尝试使用 Maven 软件将 Java 类 Restaurants2 中的数据推送到基于 derby 的 SQL 数据库。

这个想法是 Java 类将向 Derby 数据库“MyDB”的 DB 添加一些信息。

很遗憾,由于异常,我无法运行此程序(另请参阅控制台信息下方)。
我正在 MacOS Mojave 上使用 Eclipse 4.12.0。
有人知道出了什么问题吗? 干杯!

    Java class Restaurants2: 

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSetMetaData;



    public class Restaurants2
    {

    // jdbc:derby:/Users/ap/MyDB;create=true
    private static String dbURL = "jdbc:derby:/Users/ap/MyDB/;create=true;user=***;password=***";
    private static String tableName = " MYTABELLE2";
    // jdbc Connection
    private static Connection conn = null;
    private static Statement stmt = null;

    public static void main(String[] args)
    {
        createConnection();
        insertRestaurants(5, "LaVals", "Berkeley");
        selectRestaurants();
        shutdown();
    }

    private static void createConnection()
    {
        try
        {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
            //Get a connection
            conn = DriverManager.getConnection(dbURL); 
        }
        catch (Exception except)
        {
            except.printStackTrace();
        }
    }

    private static void insertRestaurants(int id, String restName, String cityName)
    {
        try
        {
            stmt = conn.createStatement();
            stmt.execute("insert into " + tableName + " values (" +
                    id + ",'" + restName + "','" + cityName +"')");
            stmt.close();
        }
        catch (SQLException sqlExcept)
        {
            sqlExcept.printStackTrace();
        }
    }

    private static void selectRestaurants()
    {
        try
        {
            stmt = conn.createStatement();
            ResultSet results = stmt.executeQuery("select * from " + tableName);
            ResultSetMetaData rsmd = results.getMetaData();
            int numberCols = rsmd.getColumnCount();
            for (int i=1; i<=numberCols; i++)
            {
                //print Column Names
                System.out.print(rsmd.getColumnLabel(i)+"\t\t");  
            }

            System.out.println("\n-------------------------------------------------");

            while(results.next())
            {
                int id = results.getInt(1);
                String restName = results.getString(2);
                String cityName = results.getString(3);
                System.out.println(id + "\t\t" + restName + "\t\t" + cityName);
            }
            results.close();
            stmt.close();
        }
        catch (SQLException sqlExcept)
        {
            sqlExcept.printStackTrace();
        }
    }

    private static void shutdown()
    {
        try
        {
            if (stmt != null)
            {
                stmt.close();
            }
            if (conn != null)
            {
                DriverManager.getConnection(dbURL + ";shutdown=true");
                conn.close();
            }           
        }
        catch (SQLException sqlExcept)
        {

        }

    }
}    

程序没有运行,我从控制台得到有异常的信息:

java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at Restaurants2.createConnection(Restaurants2.java:40)
at Restaurants2.main(Restaurants2.java:30)
Exception in thread "main" java.lang.NullPointerException
at Restaurants2.insertRestaurants(Restaurants2.java:54)
at Restaurants2.main(Restaurants2.java:31)`   

这是我从 POM 文件中的依赖项的样子:

<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.14.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbyclient</artifactId>
<version>10.10.1.1</version>
</dependency>

</dependencies>

【问题讨论】:

  • 似乎您在类路径中缺少 derby 的驱动程序库。也许这个? mvnrepository.com/artifact/org.apache.derby/derbyclient
  • 嗨!感谢您的回答,但我的依赖项中有它......
  • @leccepen - System.out.println(System.getProperty("java.version")); 显示什么?
  • 嗨@Gord Thompson,Java 版本的输出是 1.8.0_212。干杯
  • 如果您 100% 确定驱动程序已正确加载,那么您的连接 URL 一定是无效的。

标签: java maven jdbc derby


【解决方案1】:
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.15.1.3</version>

Java 版本的输出是 1.8.0_212

从版本 10.15.x 开始,Derby 需要 Java 9 或更高版本(参考:here)。

如果您想继续使用 Java 8,则必须将 Derby 降级到版本 10.14.2.0。

【讨论】:

  • 我已经有了相同的想法并更改为 10.14.2.0 但我仍然收到异常请查看我的帖子已经被编辑...
  • 从你的依赖声明中移除&lt;scope&gt;test&lt;/scope&gt;
  • 我收到“TEST”不存在的错误:'java.sql.SQLSyntaxErrorException:“TEST”不存在。在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source).´
  • 如果您不再收到“找不到合适的驱动程序”或ClassNotFoundException,那么您的连接问题已经解决,现在您面临不同的问题。你应该为此ask a new question
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 2018-06-09
  • 2012-10-06
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2019-05-25
相关资源
最近更新 更多