I'm running this via Visual Studio Code and have the Language Support for Java (TM) by RedHat extension. The quickstart code I am using is found here. I modified it slightly to become this:
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)
{
}
}
}
The main difference is Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); -> Class.forName("org.apache.derby.jdbc.ClientDriver"); //.newInstance();.
When I run it with the play button, I get this output:
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)
From my research there are three possible issues
dbURLderbyclient.jar is not in CLASSPATHderby.jar is not in CLASSPATHI assume dbURL is not malformed because it is directly copied and pasted from the apahce website. As for 2 and 3 this is my 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
Both jar files are in the classpath. I'm not sure if it is significant but the CLASSPATH variable is set inside /etc/environment. So, I am unsure of the issue I am facing. I have ran through the Apache's quickstart by creating, inserting, and selecting using ij, so i can confirm that ij works properly as does sysinfo, etc. So, I am quite certain there is no issue with derby but rather configuration, but I am unsure of what solutions are avaiable to me, thanks.
The class org.apache.derby.jdbc.ClientDriver is in derbytools.jar, not in derby.jar or derbyclient.jar.
I see that derbytools.jar is in the CLASSPATH environment variable. However, because 'the play button' is invoking java with the -cp flag set, it is ignoring the CLASSPATH environment variable. Also, derbytools.jar might not be at /home/star/.local/bin/derby/lib/derbytools.jar
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
A command line as follows should fix:
/usr/lib/jvm/java-21-openjdk-amd64/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /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:/home/star/Documents/Projects/Distributed\ Computing/DerbyTest/DerbyTest/bin Restaurants
It's easier (and more usual) to use the -jar option rather than -cp. That way your CLASSPATH env var will be used. Your build does need to create a jar for the project, eg DerbyTest.jar
/usr/lib/jvm/java-21-openjdk-amd64/bin/java -XX:+ShowCodeDetailsInExceptionMessages -jar /home/star/Documents/Projects/Distributed\ Computing/DerbyTest/DerbyTest.jar Restaurants
assuming the jar is at /home/star/Documents/Projects/Distributed Computing/DerbyTest/DerbyTest.jar