21

I face a problem about connecting to H2

this is my pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>.</groupId>
    <artifactId>dbConnection</artifactId>
    <name>Db Connection</name>
    <packaging>war</packaging>
    <version>0.1</version>

    <dependencies>
        <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.176</version>
        </dependency>
    </dependencies>


</project>

and this is my main code

import java.sql.*;

public class DbConnection 
{
   static final String DB_URL = "jdbc:h2:tcp://localhost/~/test;AUTO_SERVER=TRUE";

   public static void main(String[] args) throws Exception
   {
        try
           { 
                Class.forName("org.h2.Driver");          
                Connection conn = DriverManager.getConnection(DB_URL,"sa","");  
                conn.close();
           }
       catch(ClassNotFoundException ex)
           {
                System.out.println( "ERROR: Class not found: " + ex.getMessage()); 
           }
    }
}

is always show up that Class not found:org.h2.Driver

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
joker
  • 211
  • 1
  • 2
  • 5
  • I assume that the exception occurs when running the jar generated by maven? Does you output jar contain the driver files? – traxam May 13 '18 at 10:33

6 Answers6

35

You should set scope to runtime so that h2 driver is packaged in your war file:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.190</version>
    <scope>runtime</scope>
</dependency>
Marko Jurisic
  • 844
  • 9
  • 10
  • "A good example of dependencies that should use the runtime scope is a JDBC driver" from https://www.baeldung.com/maven-dependency-scopes . +1 – Donald Duck Jan 23 '22 at 22:36
28

I had the same problem with IntelliJ, it could not found org.h2.Driver. I tried several solutions from web but after simple restart of IntelliJ the problem was solved.

Hope this helps to save some time.

Vitalii
  • 10,091
  • 18
  • 83
  • 151
7

Found the answer here remove the runtime scope

<dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        #removed this -> <scope>test</scope> #
    </dependency>
mikelus
  • 927
  • 11
  • 25
3

I have read all the answers available and tried all of them. I am not sure which one worked but yes, It worked at last. So, try one of these or all but it will solve your problem.

  1. Remove the scope tag from your dependency first. It will look like
<scope>test</scope>

or

<scope>runtime</scope>
  1. There might be some issues with versioning.Mine working with this
<version>1.4.190</version>

you can also try these

<version>1.4.192</version> 
<version>1.4.195</version>
<version>1.4.197</version>
  1. Restart a few times might also help. I did for 2-3 times.

Finally, my dependency looks like the below code.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.190</version>
</dependency>
1

If anyone doesn't want to use h2 aside from testing, keeping the <scope>test</scope>, just remove it for a moment, let IDE understand your line, and then put the scope back in. If that doesn't help try restarting IDE.

Worked in IntelliJ IDEA.

Luca Pasini
  • 141
  • 8
0

My problem was in "" in docker-compose.yaml environment variables:

SPRING_DATASOURCE_DRIVER-CLASS-NAME="org.h2.Driver" - it does not work SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.h2.Driver - it work

burtsevyg
  • 3,851
  • 2
  • 29
  • 44