2011-01-14 16 views
16

nombre del sistema operativo: "Linux" versión: Arco "2.6.32-27-generic": "i386" Familia: "Unix"Maven no establecer la ruta de clases para las dependencias correctamente

Apache Maven 2.2.1 (r801777; 2009 -08-06 12: 16: 01-0700)

versión de Java: 1.6.0_20

estoy tratando de utilizar la dependencia MySQL con experto en ubuntu. Si muevo el archivo "mysql-connector-java-5.1.14.jar" que se descargó en mi carpeta $ JAVA_HOME/jre/lib/ext /, todo está bien cuando ejecuto el archivo jar.

Creo que debería ser capaz de simplemente especificar la dependencia en el archivo pom.xml y maven debe encargarse de establecer la ruta de clases para los tarros de dependencia automáticamente. ¿Es esto incorrecto?

Mi pom.xml se parece a esto:

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

El comando "mvn package" construye sin ningún problema, y ​​puedo ejecutarlo, pero cuando la aplicación intenta acceder a la base de datos, este error se presenta:

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 línea está fallando en es:

Class.forName("com.mysql.jdbc.Driver"); 

Puede cualquier uno me dice lo que estoy haciendo mal o cómo solucionarlo?

Respuesta

17

Raghuram me dio un empujón en la dirección correcta. La manera de conseguir experto para cuidar de la copia de los frascos de forma automática es añadir el código dentro de la etiqueta en el archivo pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>copy-dependencies</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}</outputDirectory> 
      <overWriteReleases>false</overWriteReleases> 
      <overWriteSnapshots>true</overWriteSnapshots> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Más detalles sobre esto se pueden encontrar aquí: https://maven.apache.org/plugins/maven-dependency-plugin/usage.html

Conseguir que maven empaque los frascos juntos sería bueno, pero esto es lo suficientemente bueno para responder a esta pregunta. respuestas relacionadas en StackOverflow:

Building executable jar with maven?

How can I create an executable JAR with dependencies using Maven?

+0

+1 para enlace a maven-assembly-plugin. Aquí hay otro: http://maven.apache.org/plugins/maven-assembly-plugin/usage.html –

2

Maven establece correctamente la ruta de clase a las dependencias, pero no incluye el prefijo de la ubicación del repositorio. Se verá así en su archivo Manifest.

Class-Path: mysql-connector-java-5.1.14.jar 

Es hasta que coloque los frascos dependientes de la misma carpeta que el frasco que se está ejecutando.

Consulte the examples

+0

Gracias, esto me hizo mucho más cerca. Pude agregar el objetivo de dependencia: copia-dependencias al archivo pom.xml para que maven maneje la copia de las dependencias automáticamente. – Matthew

12

Sé que esta pregunta es viejo, pero se presenta en la parte superior de las búsquedas para obtener Maven para configurar las dependencias correctamente con versiones -SNAPSHOT y tuve que refinar la solución aceptada para que la resolución de mi classpath funcione correctamente.

El problema que encontré fue que maven-jar-plugin incluía la resolutionVersion de una dependencia (p. Ej.,. Jar) mientras que maven-dependency-plugin (a partir de la versión 2.5.1) copiaba dependencias conservando su baseVersion --SNAPSHOT.jar). (Consulte https://jira.codehaus.org/browse/MDEP-380 para obtener más información acerca de esa mejora).)

Para que las cosas funcionen, tuve que desactivar este comportamiento de la siguiente manera:

... 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>dependency/</classpathPrefix> 
         <mainClass>com.example.MainClass</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <useBaseVersion>false</useBaseVersion> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    ... 

Esta configuración hizo que las dependencias que desea copiar en $ {} project.build.directory/dependencia con su juego resolvedVersion el blasspath se establece en META-INF/MANIFEST.MF por maven-jar-plugin. Espero que esto ayude a alguien en el futuro.

+1

De acuerdo con el rastreador de errores, este problema se corrigió desde la versión 2.6. –

Cuestiones relacionadas