web-dev-qa-db-fra.com

java ClassNotFoundException pour org.h2.Driver

J'essaie d'utiliser H2 pour me connecter à une base de données en Java (en utilisant Eclipse comme IDE). L'exemple ci-dessous lance une ClassNotFoundException. Le problème est que I did ajoute le fichier jar h2 au système CLASSPATH. J'ai même vérifié que c'était là plusieurs fois via printenv dans la console. Est-ce que je suis en train d'omettre un pas?

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);

 }

}
25
Ashton Wilkins

Dans mon cas (un peu différent, mais il convient de le mentionner), j'ai ajouté ceci à mon pom-pom, et le message d'erreur est parti:

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
  </dependency>

ou si vous utilisez uniquement h2 lors des tests unitaires:

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
    <scope>test</scope>
  </dependency>
30
rogerdpack

Récemment, j'ai rencontré l'exception Java.lang.ClassNotFoundException: org.h2.Driver dans IntelliJ IDEA 2017.2 EAP en utilisant la dernière version (1.4.196) de H2 driver. La solution consistait à revenir à la version 1.4.195 qui fonctionnait.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.195</version>
    <scope>test</scope>
</dependency>
12
naXa

L'exemple (ci-dessous) lève une exception ClassNotFoundException.

Alors le pilote n'est pas sur le classpath.

Le fait est que j'ai ajouté le fichier jar h2 au système CLASSPATH. J'ai même vérifié qu'il est là plusieurs fois via 'printenv' dans la console. 

Comment avez-vous fait cela exactement? S'il vous plaît montrer la sortie obtenue. 

Est-ce que je suis en train d'omettre un pas?

Je ne peux pas dire avec les informations fournies. Mais s’appuyer sur la variable d’environnement CLASSPATH est quand même une mauvaise pratique et vous devez utiliser l’option -cp si vous exécutez Java sur la ligne de commande. Comme ça:

Java -cp h2.jar com.acme.Program

Existe-t-il un moyen de configurer Eclipse pour qu'il utilise le fichier jar lorsque j'utilise le menu RUN afin que je ne sois pas obligé de l'exécuter à partir de la console?

Oui. Sous Eclipse, ajoutez le fichier JAR au chemin de construction du projet: clic droit sur votre projet, puis Propriétés> Chemin de construction Java> Bibliothèques> Ajouter des fichiers JARS ... (en supposant que le fichier H2 disponible dans un répertoire relatif à votre projet). D'autres IDE ont un moyen équivalent de le faire.

7
Pascal Thivent

Dans mon cas (j'utilise sbt) Change

libraryDependencies += "com.h2database" % "h2" % "1.4.196" % Test

à

libraryDependencies += "com.h2database" % "h2" % "1.4.196"
2
Xianhong Xu

Le <scope>[database_name]</scope> devrait inclure la base de données avec laquelle vous travaillez. Si vous changez votre base de données d'une marque à une autre, veillez également à modifier l'étendue. Dès que je l'ai changé, l'erreur est partie.

2
Dhiraj Gandhi

J'avais l'erreur suivante (en utilisant Intellij) 

Java ClassNotFoundException pour org.h2.Driver

Résolu en supprimant la portée de mon pom.

était:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>test</scope>
    </dependency>

changé en:

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

Utilisez la version release.

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
0
Vahe Gharibyan

Dans mon cas, c'est en fait le problème de la chaîne de connexion. J'ai vu cela mentionné quelque part sur le Web: par exemple, https://dzone.com/articles/working-with-embedded-Java-databases-h2-amp-intell

Après avoir ajouté le "mem" dans la chaîne d'URL ci-dessous, cela a fonctionné. J'ai probablement passé 2 heures sur ce . String url = "jdbc: h2: mem: ~/test";

0
uudaddy