You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已将derbyclient.jar加入CLASSPATH仍提示找不到org.apache.derby.jdbc.ClientDriver类

已将derbyclient.jar加入CLASSPATH仍提示找不到org.apache.derby.jdbc.ClientDriver类

我正在通过Visual Studio Code运行代码,安装了Language Support for Java (TM) by RedHat扩展。使用的快速启动代码基于Apache Derby的官方示例,我做了一点修改,把Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();改成了Class.forName("org.apache.derby.jdbc.ClientDriver"); //.newInstance();。修改后的完整代码如下:

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 Restaurants
{
    private static String dbURL = "jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine";
    private static String tableName = "restaurants";
    // 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.ClientDriver"); //.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)
        {
            
        }

    }
}

点击运行按钮后,我得到了如下报错输出:

star@platinum:~/Documents/Projects/Distributed Computing/DerbyTest/DerbyTest$  /usr/bin/env /usr/lib/jvm/java-21-openjdk-amd64/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /home/star/Documents/Projects/Distributed\ Computing/DerbyTest/DerbyTest/bin Restaurants 
java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:421)
        at java.base/java.lang.Class.forName(Class.java:412)
        at Restaurants.createConnection(Restaurants.java:29)
        at Restaurants.main(Restaurants.java:19)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.sql.Connection.createStatement()" because "Restaurants.conn" is null
        at Restaurants.insertRestaurants(Restaurants.java:43)
        at Restaurants.main(Restaurants.java:20)

我查了资料,可能的问题有三个:

  • 格式错误的dbURL
  • derbyclient.jar不在CLASSPATH中
  • derby.jar不在CLASSPATH中

我觉得dbURL没问题,因为是直接从Apache官网复制的。至于后两点,我的CLASSPATH已经包含了这两个jar包,CLASSPATH内容如下:

/home/star/.local/bin/derby/lib/derbynet.jar:/home/star/.local/bin/derby/lib/derbyshared.jar:/home/star/.local/bin/derby/lib/derbyLocale_zh_CN.jar:/home/star/.local/bin/derby/lib/derbyLocale_pl.jar:/home/star/.local/bin/derby/lib/derbyLocale_pt_BR.jar:/home/star/.local/bin/derby/lib/derbyLocale_ja_JP.jar:/home/star/.local/bin/derby/lib/derbyoptionaltools.jar:/home/star/.local/bin/derby/lib/derbyrun.jar:/home/star/.local/bin/derby/lib/derbyLocale_de_DE.jar:/home/star/.local/bin/derby/lib/derbyLocale_ru.jar:/home/star/.local/bin/derby/lib/derbyLocale_es.jar:/home/star/.local/bin/derby/lib/derby.jar:/home/star/.local/bin/derby/lib/derbyLocale_it.jar:/home/star/.local/bin/derby/lib/derbyLocale_ko_KR.jar:/home/star/.local/bin/derby/lib/derbyLocale_fr.jar:/home/star/.local/bin/derby/lib/derbyclient.jar:/home/star/.local/bin/derby/lib/derbytools.jar:/home/star/.local/bin/derby/lib/derbyLocale_zh_TW.jar:/home/star/.local/bin/derby/lib/derbyLocale_cs.jar:/home/star/.local/bin/derby/lib/derbyLocale_hu.jar

两个jar包都在CLASSPATH里,而且这个环境变量是在/etc/environment中设置的。我已经通过ij工具完成了创建、插入、查询等操作,ij和sysinfo都能正常工作,所以我确定Derby本身没有问题,应该是配置的问题,但不知道该怎么解决,求帮忙。

备注:内容来源于stack exchange,提问作者AlphabetsAlphabets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:48:05