2012-02-21 18 views
22

Estoy usando una biblioteca que usa Maven para compilar y probar.
Pude compilar la biblioteca sin ningún problema. Mientras compilaba, parecía que descargaba todas las dependencias de la biblioteca.Recopilación de las dependencias transitivas de la dependencia basada en Maven a un classpath del proyecto no Maven

Ahora, intento usar la biblioteca en mi proyecto. Cuando compilé la biblioteca, encontré que se creó una carpeta llamada target en la carpeta de la biblioteca y dentro de esa carpeta, había otra carpeta llamada classes. Agregué la carpeta classes a mi classpath. Sin embargo, cada vez que trato de usar esa biblioteca en mi proyecto que no usa Maven, dice que no puede encontrar las dependencias de esa biblioteca.

¿Cómo agrego todas las dependencias de esa biblioteca a mi classpath?
¿Debo ir y descargar manualmente todas las dependencias de la biblioteca y agregarlas a classpath?
¿Hay alguna manera en que pueda hacer que Maven haga eso por mí?
¿Qué debo hacer para poder usar la biblioteca en mi proyecto?

Mi proyecto está en un directorio completamente independiente de la biblioteca. En este momento, mi proyecto parece ser capaz de cargar los archivos de la biblioteca correctamente, pero no las dependencias de la biblioteca.

+4

+1, pregunta muy importante para los novatos maven. –

Respuesta

14

Cuando ejecutó mvn install para esa biblioteca, debería haber creado un archivo jar y ponerlo en target/libaryname-version.jar. Sería mejor depender de este jar final en lugar del contenido de la carpeta classes. Maven también tiene el objetivo de descargar todas las dependencias de un proyecto. Puede ejecutar

mvn dependency:copy-dependencies 

Dentro de la carpeta de bibliotecas y va a copiar todos los frascos de dependencia a target/dependency. Por defecto, esto también incluirá tarros que solo son necesarios para las pruebas, para excluir estos puede usar

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

¡Genial hack!Funcionó para mí, pero mi necesidad era ligeramente diferente. En mi caso, fue suficiente para obtener el classpath. Puede generar classpath y enviarlo a algún archivo en recursos, que puede usar más adelante. código es aquí ' \t \t \t \t org.apache.maven.plugins \t \t \t \t experto-dependencia-plugin \t \t \t \t generar fuentes- acumulación de ruta de clase \t \t \t $ {project.basedir}/src/main/resourc es/classpath ' – raxith

+0

@raxith envíe esto como su propia respuesta, la sección del código es demasiado larga para interpretar. –

+0

@ Jörn Horstmann Entonces, después de ejecutar el objetivo de copia-dependencia, para ejecutar el código tenemos que ejecutar el 'java -cp" target \ *; target \ dependency \ * "com.myCompany.App' de la carpeta del proyecto? –

4

Bueno, hay un par de problemas en el trabajo aquí. Maven hace el trabajo duro de descifrar todas las dependencias requeridas para que se construya su biblioteca y las descarga. Estas dependencias se almacenan localmente en su repositorio Maven (<user home>/.m2/repository), pero a menos que se necesiten como parte de un ensamblado, no las encontrará en la carpeta target. Al menos, no de forma predeterminada. Lo que hay que hacer primero es conseguir Maven para almacenar todas las dependencias en la carpeta de compilación (este extracto POM se cribbed de another SO post):

<project> 
... 
    <profiles> 
     <profile> 
      <id>qa</id> 
      <build> 
       <plugins> 
        <plugin> 
         <artifactId>maven-dependency-plugin</artifactId> 
          <executions> 
           <execution> 
            <phase>install</phase> 
            <goals> 
             <goal>copy-dependencies</goal> 
            </goals> 
            <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
            </configuration> 
           </execution> 
          </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

Con los cambios POM se muestran arriba Ahora debería ser capaz de obtener todo el JAR dependencias necesarias para su biblioteca e incluirlas en su classpath (desde target/lib). Recomendaría copiarlos a otra carpeta en su estación de trabajo, ya que la carpeta target se numerará cada vez que ejecute el objetivo clean para las bibliotecas Maven build.

Ahora, habiendo dicho todo eso, ¿por qué no adaptar su proyecto para usar Maven también? ¿Entonces todo lo que tendría que hacer es incluir el JAR de nivel superior como una dependencia en su POM, y Maven manejaría todas sus subdependencias? Este es el poder de Maven, después de todo, sería ventajoso aprovecharlo.

En cualquier caso, buena suerte con cualquiera de los dos enfoques que seleccione.

Cuestiones relacionadas