已将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
相关产品推荐
相关产品推荐

