Maven: ¿Cómo incluir frascos, que no están disponibles en representantes en un proyecto J2EE?

100

en mi proyecto J2EE tengo un par de dependencias, que no están disponibles en ningún repositorio de Maven, porque son bibliotecas propietarias. Estas bibliotecas deben estar disponibles en tiempo de ejecución, por lo que deben copiarse en el destino /.../ WEB-INF / lib ...

En este momento, los enumero como dependencia del sistema en mi POM, pero con este método el problema es que no se copian en la compilación de destino durante la compilación. Además, este método no es muy elegante.

Entonces, ¿cuál es la mejor manera de integrarlos en Maven?

Nota: no quiero crear mi propio repositorio de Maven.

Sansón
fuente
7
Yo realmente creo que debe revisar su decisión de crear un repositorio Maven. No es nada difícil y merece la pena al 100%.
Robert Munteanu
7
El valor de crear un repositorio Maven depende de las circunstancias.
yincrash

Respuestas:

54

Como ha dicho, no desea configurar su propio repositorio, tal vez esto ayude.

Puede utilizar el objetivo del archivo de instalación de maven-install-plugin para instalar un archivo en el repositorio local. Si crea un script con una invocación de Maven para cada archivo y lo mantiene junto con los archivos jar, usted (y cualquier otra persona con acceso) puede instalar fácilmente los archivos jar (y los archivos pom asociados) en su repositorio local.

Por ejemplo:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

o solo

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

A continuación, puede hacer referencia a las dependencias como de costumbre en su proyecto.

Sin embargo, tu mejor opción es configurar un repositorio remoto interno y te recomiendo usar Nexus . Puede ejecutarse en su caja de desarrollo si es necesario, y la sobrecarga es mínima.

Vendedor rico
fuente
1
Gracias, este método me está funcionando bien ahora. Extendí el POM para que los archivos se instalen automáticamente en el representante local: pastebin.ca/1504318
samson
Me alegra ayudar, pero como han dicho otros, el mejor enfoque sería utilizar un administrador de repositorio de Maven. Este enfoque no se escala bien.
Rich Seller
4
El comando que funcionó para mí: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick
193

Para las personas que desean una solución rápida a este problema:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

simplemente dé a su biblioteca un ID de grupo único y un nombre de artefacto y señale dónde se encuentra en el sistema de archivos. Tú eres bueno para irte.

Por supuesto, esta es una solución rápida sucia que SOLO funcionará en su máquina y si no cambia la ruta a las bibliotecas. Pero algunas veces, eso es todo lo que desea, ejecutar y hacer algunas pruebas.

EDITAR: simplemente volvió a repetir la pregunta y me di cuenta de que el usuario ya estaba usando mi solución como una solución temporal. Dejaré mi respuesta como una ayuda rápida para otros que vengan a esta pregunta. Si alguien no está de acuerdo con esto, déjeme un comentario. :)

Ric Jafe
fuente
4
Frio. ¿Hay alguna forma de especificar una URL en lugar de una ruta de máquina local?
phreakhead
3
¡¡¡Gracias por un ejemplo completo y funcional !!! Espero que atrapes un pez dorado y te conceda tres deseos. :)
johndodo
14
Esta debería ser la respuesta aceptada ya que es autónoma (en pom.xml)
Vikram
2
Hola Rajarshee, los identificadores de grupo y artefacto son completamente arbitrarios. La ruta a su jar en el sistema de archivos es todo lo que importa para que esto funcione. Debido a que en realidad el tarro no es una dependencia de maven, solo le está diciendo a Maven que lo trate como tal.
Ric Jafe
1
A partir de 2016, esto no parece funcionar. La compilación reconoce la ruta pero no incluye el código en el tarro sombreado. Ratas ...
markthegrea
24

Cree una carpeta de repositorio en su proyecto. Echemos

${project.basedir}/src/main/resources/repo

Luego, instale su jar personalizado en este repositorio:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Por último, agregue las siguientes definiciones de repositorio y dependencia a los proyectos pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>
mostar
fuente
1
Esto funcionó muy bien para mí. PD: recomendaría un directorio diferente para el repositorio local, ya que ponerlo dentro de "src" no parecía correcto (¡no es la fuente!)
Davidfrancis
1
Funcionó a las mil maravillas. Estoy migrando un proyecto antiguo de Ant a Maven y hay algunas bibliotecas que no puedo encontrar en los repositorios web.
Paulo Pedroso
Precaución: cuando el valor de -DlocalRepositoryPath no termina en /(es decir, indica una carpeta), el repositorio se crea con groupId. Por foo.comejemplo : si el ID de grupo es y localRepositoryPath es repo, entonces la carpeta de repositorio se convierte en repo.foo.com.
Sheshadri Mantha
Este procedimiento es como un proyecto local para la gestión del repositorio del sistema utilizando la herramienta de automatización de compilación maven que se utiliza principalmente para proyectos Java y el sistema de archivos.
Oleksii Kyslytsyn
8

Necesita configurar un repositorio local que albergará dichas bibliotecas. Hay varios proyectos que hacen exactamente eso. Por ejemplo Artifactory .

Gregory Mostizky
fuente
4
Un punto en la terminología, esos son repositorios remotos internos, no repositorios locales. El repositorio local es aquel en el que se descargan las dependencias del sistema de archivos local.
Rich Seller
3

¡Ninguna de las soluciones funciona si está utilizando la compilación Jenkins! Cuando pom se ejecuta dentro del servidor de compilación de Jenkins ... estas soluciones fallarán, ya que Jenkins ejecutará pom intentará descargar estos archivos del repositorio empresarial.

Copie los frascos en src / main / resources / lib (cree la carpeta lib). Estos serán parte de su proyecto y llegarán hasta el servidor de implementación. En el servidor de implementación, asegúrese de que sus scripts de inicio contengan src / main / resources / lib / * en classpath. Viola.

Apurva Singh
fuente
2

puede instalarlos en un repositorio local privado (por ejemplo, .m2 / repository en su directorio de inicio): más detalles aquí

dfa
fuente
7
Sí, podría hacer eso, pero luego tendría que decirles a todos los que quieran construir el proyecto que tienen que poner los archivos X, Y en el directorio Z y eso realmente complica las cosas. Después de todo, quiero usar Maven para simplificar el proceso de construcción.
samson
2

Si lo entiendo bien, si lo que desea hacer es exportar dependencias durante la fase de compilación para que no haya necesidad de recuperar manualmente cada una de las bibliotecas necesarias, puede usar las dependencias de copia de mojo .

Espero que pueda ser útil en su caso ( ejemplos )

Erik Clairiot
fuente
2

La solución de @Ric Jafe es lo que funcionó para mí.

Esto es exactamente lo que estaba buscando. Una forma de impulsarlo para investigar el código de prueba. Nada sofisticado. Sí, sé que eso es lo que todos dicen :) Las diversas soluciones de complementos de Maven parecen ser excesivas para mis propósitos. Tengo algunos frascos que me fueron entregados como bibliotecas de terceros con un archivo pom. Quiero que se compile / ejecute rápidamente. Esta solución que adapté trivialmente a Python funcionó de maravilla para mí. Cortar y pegar en mi pom. El código Python / Perl para esta tarea se encuentra en estas preguntas y respuestas: ¿Puedo agregar archivos jar a la ruta de clases de compilación de maven 2 sin instalarlos?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1
Pablo
fuente
La solución anterior devuelve 'dependencies.dependency.systemPath' para xx.jar no debe apuntar a archivos dentro del directorio del proyecto. Ver stackoverflow.com/questions/10935135/…
sarah.ferguson
1

Instalar solo no funcionó para mí.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Jonathan Hendler
fuente