I am trying to use H2 to connect to a database in Java (using Eclipse as the IDE). The sample does (below) throws a ClassNotFoundException
. The thing is, I did add the h2 jar file to the system CLASSPATH. I have even checked it's there several times via printenv
in the console. Am I omitting a step?
CODE:
import java.sql.*;
public class Program {
/**
* @param args
*/
public static void main(String[] args)
throws Exception{
try{
System.out.println("hello, world!");
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:~/testdb", "sa", "");
// add application code here
conn.close();
}catch(ClassNotFoundException ex){
System.out.println( "ERROR: Class not found: " + ex.getMessage() );
}
System.exit(0);
}
}
Then the driver is not on the classpath.
How did you do that exactly? Please show the obtained output.
I can't say with the provided informations. But relying on the
CLASSPATH
environment variable is a bad practice anyway and you should use the-cp
option if you're running Java on the command line. Like this:Yes. Under Eclipse, add the JAR to the project build path: right-click on your project then Properties > Java Build Path > Libaries > Add JARS... (assuming the H2 JAR is available in a directory relative to your project). Others IDE have equivalent way of doing this.
In my case it's actually the connection string issue. I saw this mentioned somewhere over the web: e.g., https://dzone.com/articles/working-with-embedded-java-databases-h2-amp-intell
After I added the "mem" in the URL string below, it worked. I probably spent 2 hours on this. String url = "jdbc:h2:mem:~/test";
The
<scope>[database_name]</scope>
should include the database you are working with. If you change your db from one to another, make sure to change the scope also. As soon as i changed it the error went away.In my case (unrelated a bit, but worth mentioning), I added this to my maven pom, and the error message went away:
or if you are only using h2 during unit testing:
In my case(I use sbt) change
to
Using
<scope>test</scope>
should not work logically. try it with<scope>runtime</scope>
or<scope>provided</scope>
, unless you need it only for testing phase.On maven docs, it says that
<scope>test</scope>
dependency is not required for normal use of the application, and is only available for the test compilation and execution phaseshttps://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html