web-dev-qa-db-fra.com

Maven - Java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

J'ai une application Java basée sur Maven et je souhaite me connecter au serveur MySQL.

Mon pom a:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>runtime</scope>
</dependency>

Avec runtime, comme je veux me connecter au serveur MySQL au moment de l'exécution, j'ai également essayé de compiler et de fournir, mais ne fonctionne pas.

Le code SQL est standard:

String dbClass = "com.mysql.jdbc.Driver";

Class.forName(dbClass);
Connection connection = DriverManager.getConnection(dbUrl,
    username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
    String tableName = resultSet.getString(1);
    System.out.println("Table name : " + tableName);
}

Lorsque je lance ce à partir d’Eclipse , cela fonctionne correctement et affiche les noms de table.

Cependant, depuis maven, le SNAPSHOT généré donne toujours une erreur lorsqu’il est exécuté via> Java -jar target\File.jar après avoir exécuté mvn clean install.

Java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Qu'est-ce qui me manque ici pour que le maven puisse fonctionner? Exécuter mvn clean install ne donne pas d'erreur et se construit bien. Ce n'est que lors de l'exécution de l'exécutable SNAPSHOT que l'erreur se produit.

Le fichier jar MySQL se trouve dans mon référentiel .m2 et j'ai essayé de l'ajouter explicitement via la ligne de commande mvn, mais il dit qu'il existe déjà.

7
pokero

Changez la portée en compile:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

Ce qui - puisqu'il s'agit de la portée par défaut, correspond à laisser la définition de portée du tout - les mêmes comptes pour le type:

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-Java</artifactId>
   <version>5.1.17</version>
</dependency>

Jetez un coup d'œil à ceci: https://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html pour des informations détaillées sur la portée. 

Voici une info rapide pour votre arrière-plan: 

Vous avez spécifié que le pilote JDBC avait une étendue runtime. La plupart des IDE ignorent de toute façon les portées et ajoutent toutes vos dépendances à leur chemin de classe (par exemple, le chemin de classe utilisé lorsque vous exécutez quelque chose en dehors de Eclipse. Par la portée runtime, vous indiquez à maven qu'il ne doit pas inclure cette dépendance dans votre jar final puisque l’environnement d’exécution fournira cette dépendance à runtime. Par exemple, vous devrez soit l’ajouter manuellement au chemin de classe lors de l’appel de votre jar, soit changer l’étendue en compile, ce qui conduira à placer le pilote-jar dans votre jar et disponible au moment de l'exécution. 

14
JBA

La réponse est ici - Comment créer un fichier JAR exécutable avec des dépendances utilisant Maven?

J'avais besoin de créer un super pom, en utilisant la réponse dans le lien ci-dessus - cela intègre les dépendances (dans ce cas, le fichier jar mysql) en un seul fichier jar SNAPSHOT.

Assurez-vous simplement de l'exécuter avec mvn clean compile Assembly:single (pas le mvn clean package habituel ou quoi que ce soit d'autre).

2
pokero

Comme vous exécutez le projet avec "Java -jar" et que vous avez des dépendances, vous devez utiliser deux plugins Maven. Le premier permet de copier les dépendances dans un dossier du dossier cible (par exemple, lib /) lors du conditionnement et le second pour spécifier le chemin de classe, qui doit être identique au premier (lib /). J'ai eu le même problème et voici ce que j'ai fait:

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            ${project.build.directory}/lib
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>

                  <mainClass>com.tihoo.crawler.Application</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
1
Khosro Makari

J'ai eu ce problème aussi. J'ai essayé d'utiliser des plugins pour définir le connecteur sur classpath mais cela n'a pas fonctionné. J'ai essayé de changer de version, ça n'a pas marché. J'ai passé deux nuits à découvrir que je devais spécifier dans pom.xml que j'avais besoin que mon colis soit une "guerre".

C'est peut-être parce que votre projet ne sait pas de quel type il s'agit, essayez donc de mettre ceci:

<packaging>war</packaging>

juste à côté de la version de votre projet. Quelque chose comme ça:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 
http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>example-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!-- Here -->

<properties>
    <!-- Some properties here -->
</properties>

<dependencies>
    <!-- Some dependencies here -->
</dependencies>

Cela ne convient peut-être pas à votre problème, mais peut-être que quelqu'un d'autre en aura besoin.

0
Chris