Maven ne définit pas correctement le chemin de classe pour les dépendances
Nom du système d'exploitation: linux version: "2.6.32-27-generic" arch: "i386" de la Famille: "unix"
Apache Maven 2.2.1 (r801777; 2009-08-06 12:16:01-0700)
Version de Java: 1.6.0_20
Je suis en train d'utiliser le mysql de dépendance avec maven dans ubuntu. Si je déplace le "mysql-connector-java-5.1.14.jar" fichier maven téléchargé dans ma $JAVA_HOME/jre/lib/ext/dossier, tout va bien, quand je lance le pot.
Je pense que je devrais être en mesure d'indiquer seulement la dépendance dans le pom.xml fichier et maven doit prendre soin de fixer le chemin de la dépendance des pots automatiquement. Est-ce incorrect?
Mon pom.xml fichier ressemble à ceci:
<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.ion.common</groupId>
<artifactId>TestPreparation</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>TestPrep</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.ion.common.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- JUnit testing dependency -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
La commande "mvn package" construit sans aucun problème, et je peux le faire tourner, mais lorsque l'application tente d'accéder à la base de données, cette erreur est présenté:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at com.ion.common.Functions.databases(Functions.java:107)
at com.ion.common.App.main(App.java:31)
La ligne, c'est un échec:
Class.forName("com.mysql.jdbc.Driver");
Quelqu'un peut me dire ce que je fais mal ou comment résoudre le problème?
source d'informationauteur Matthew
Vous devez vous connecter pour publier un commentaire.
Raghuram m'a donné un coup de pouce dans la bonne direction. La façon d'obtenir maven pour prendre soin de copier les pots automatiquement est d'ajouter ce code à l'intérieur de la balise dans la pom.xml fichier:
Plus de détails sur ce qui peut être trouvé ici:
https://maven.apache.org/plugins/maven-dependency-plugin/usage.html
Arriver maven pour emballer les pots ensemble serait bien, mais c'est assez bon pour répondre à cette question. Réponses sur stackoverflow:
La construction de l'exécutable jar avec maven?
Comment puis-je créer un fichier exécutable JAR avec des dépendances à l'aide de Maven?
Je sais que cette question est ancienne, mais elle s'affiche en haut de recherches pour l'obtention de Maven pour définir les dépendances correctement avec d'INSTANTANÉ de versions et j'ai dû affiner la solution retenue pour obtenir mon classpath résolution de fonctionner correctement.
Le problème que j'ai rencontré était que le maven-jar-plugin inclus le resolvedVersion d'une dépendance (par exemple,--.jar), tandis que le maven-dépendance-plugin (de la version 2.5.1) des copies des dépendances de la préservation de leur baseVersion --SNAPSHOT.jar). (Voir https://jira.codehaus.org/browse/MDEP-380 pour plus d'info au sujet de cette amélioration.)
Pour obtenir des choses de travail, j'ai dû désactiver ce comportement comme suit:
Cette configuration causé les dépendances à être copié dans
${project.build.directory}/dependency
avec leurresolvedVersion
correspondant à la blasspath être mis dans laMETA-INF/MANIFEST.MF
par le maven-jar-plugin. Espérons que cela aide quelqu'un dans le futur.Maven n'définir le classpath de l'correctement les dépendances, mais pas avec le préfixe emplacement du dépôt. Il ressemble à ceci dans votre
Manifest
fichier.Il est jusqu'à vous de placer la personne à charge pots dans le même dossier que le pot qui vous êtes en cours d'exécution.
Reportez-vous à les exemples