Maven2 me está volviendo loco durante la fase de experimentación / maqueta rápida y sucia del desarrollo.
Tengo un pom.xml
archivo que define las dependencias para el marco de la aplicación web que quiero usar, y puedo generar rápidamente proyectos iniciales a partir de ese archivo. Sin embargo, a veces quiero vincular a una biblioteca de terceros que aún no tiene un pom.xml
archivo definido, por lo que en lugar de crear el pom.xml
archivo para la biblioteca de terceros a mano e instalarlo, y agregar la dependencia a mi pom.xml
, me gustaría decirle a Maven: "Además de mis dependencias definidas, incluya todos los frascos que también estén /lib
".
Parece que esto debería ser simple, pero si lo es, me estoy perdiendo algo.
Cualquier sugerencia sobre cómo hacer esto es muy apreciada. Aparte de eso, si hay una manera simple de apuntar a Maven a un /lib
directorio y crear fácilmente uno pom.xml
con todos los archivos adjuntos asignados a una sola dependencia que luego podría nombrar / instalar y vincular de una sola vez, también sería suficiente.
Respuestas:
Problemas de enfoques populares
La mayoría de las respuestas que encontrará en Internet le sugerirán que instale la dependencia en su repositorio local o que especifique un alcance de "sistema" en
pom
y distribuya la dependencia con la fuente de su proyecto. Pero ambas soluciones son realmente defectuosas.¿Por qué no debería aplicar el enfoque "Instalar en repositorio local"?
Cuando instala una dependencia en su repositorio local, permanece allí. Su artefacto de distribución funcionará bien siempre que tenga acceso a este repositorio. El problema es que, en la mayoría de los casos, este repositorio residirá en su máquina local, por lo que no habrá forma de resolver esta dependencia en ninguna otra máquina. Claramente, hacer que su artefacto dependa de una máquina específica no es una forma de manejar las cosas. De lo contrario, esta dependencia deberá instalarse localmente en cada máquina que trabaje con ese proyecto, lo que no es mejor.
¿Por qué no debería aplicar el enfoque "Alcance del sistema"?
Los frascos de los que depende con el enfoque de "Alcance del sistema" no se instalan en ningún repositorio ni se adjuntan a sus paquetes de destino. Es por eso que su paquete de distribución no tendrá una forma de resolver esa dependencia cuando se use. Creo que esa fue la razón por la cual el uso del alcance del sistema incluso quedó en desuso. De todos modos, no desea confiar en una función obsoleta.
La solución de repositorio estático en el proyecto
Después de poner esto en tu
pom
:para cada artefacto con una identificación de grupo de forma
x.y.z
Maven incluirá la siguiente ubicación dentro del directorio de su proyecto en su búsqueda de artefactos:Para obtener más información sobre esto, puede leer esta publicación de blog .
Use Maven para instalar en el repositorio del proyecto
En lugar de crear esta estructura a mano, recomiendo usar un complemento Maven para instalar sus jarras como artefactos. Entonces, para instalar un artefacto en un repositorio dentro del proyecto en la
repo
carpeta, ejecute:Si elige este enfoque, podrá simplificar la declaración del repositorio
pom
para:Un guión de ayuda
Dado que ejecutar el comando de instalación para cada lib es un poco molesto y definitivamente propenso a errores, he creado un script de utilidad que instala automáticamente todos los
lib
archivos jar de una carpeta a un repositorio de proyectos, mientras resuelve automáticamente todos los metadatos (groupId, artifactId y etc.) de nombres de archivos. El script también imprime las dependencias xml para que las copie y pegue en supom
.Incluya las dependencias en su paquete de destino
Cuando haya creado su repositorio en el proyecto, habrá resuelto el problema de distribuir las dependencias del proyecto con su fuente, pero desde entonces el artefacto objetivo de su proyecto dependerá de los frascos no publicados, así que cuando instale en un repositorio tendrá dependencias irresolubles.
Para superar este problema, sugiero incluir estas dependencias en su paquete de destino. Esto puede hacerlo con el complemento de ensamblaje o mejor con el complemento de OneJar . La documentación oficial sobre OneJar es fácil de entender.
fuente
Solo para desechar código
establece el alcance == sistema y solo crea un groupId, artifactId y una versión
Nota: las dependencias del sistema no se copian en el jar / war resultante
(consulte Cómo incluir las dependencias del sistema en war construido con Maven )
fuente
system
alcance es una práctica horrible que se desaconseja encarecidamente . Ver dependencia + ámbitos .Puede crear un repositorio local en su proyecto
Por ejemplo, si tiene una
libs
carpeta en la estructura del proyectoEn la
libs
carpeta, debe crear una estructura de directorios como:/groupId/artifactId/version/artifactId-version.jar
En tu pom.xml debes registrar el repositorio
y agrega dependencia como siempre
Eso es todo.
Para obtener información detallada: Cómo agregar bibliotecas externas en Maven
fuente
Nota: Al usar el alcance del sistema ( como se menciona en esta página ), Maven necesita rutas absolutas.
Si sus jarras están debajo de la raíz de su proyecto, querrá prefijar sus valores de SystemPath con $ {basedir}.
fuente
Esto es lo que he hecho, también resuelve el problema del paquete y funciona con el código desprotegido.
Creé una nueva carpeta en el proyecto en mi caso que usé
repo
, pero siéntase libre de usarsrc/repo
En mi POM tenía una dependencia que no está en ningún repositorio público de Maven
Luego creé los siguientes directorios
repo/com/dovetail/zoslog4j/1.0.1
y copié el archivo JAR en esa carpeta.Creé el siguiente archivo POM para representar el archivo descargado (este paso es opcional, pero elimina una ADVERTENCIA) y ayuda al siguiente chico a averiguar de dónde saqué el archivo para empezar.
Dos archivos opcionales que creo son las sumas de verificación SHA1 para el POM y el JAR para eliminar las advertencias de suma de verificación que faltan.
Finalmente agrego el siguiente fragmento a mi pom.xml que me permite referirme al repositorio local
fuente
Realmente debería tener un marco establecido a través de un repositorio e identificar sus dependencias por adelantado. Usar el alcance del sistema es un error común que la gente usa, porque "no les importa la gestión de la dependencia". El problema es que al hacer esto, terminas con una construcción pervertida de maven que no mostrará maven en condiciones normales. Sería mejor seguir un enfoque como este .
fuente
Así es como agregamos o instalamos un jar local
di algunos groupId y artifactId predeterminados porque son obligatorios :)
fuente
El complemento de instalación de Maven tiene uso de línea de comandos para instalar un jar en el repositorio local, POM es opcional pero deberá especificar GroupId, ArtifactId, Version y Packaging (todo el material de POM).
fuente
El uso
<scope>system</scope>
es una idea terrible por razones explicadas por otros, instalar el archivo manualmente en su repositorio local hace que la compilación sea irreproducible, y el uso<url>file://${project.basedir}/repo</url>
tampoco es una buena idea porque (1) puede que no sea unafile
URL bien formada (por ejemplo, si el proyecto está desprotegido en un directorio con caracteres inusuales), (2) el resultado no se puede usar si el POM de este proyecto se usa como una dependencia del proyecto de otra persona.Suponiendo que no está dispuesto a cargar el artefacto en un repositorio público, la sugerencia de Simeon de un módulo auxiliar hace el trabajo. Pero hay una manera más fácil ahora ...
La recomendación
Utilice el complemento no maven-jar-maven-plugin . Hace exactamente lo que estaba pidiendo, sin ninguno de los inconvenientes de los otros enfoques.
fuente
Encontré otra forma de hacer esto, mira aquí desde una publicación de Heroku
Para resumir (perdón por copiar y pegar)
repo
directorio debajo de su carpeta raíz:pom.xml
:fuente
Después de tener una discusión muy larga con muchachos de CloudBees sobre el empaquetado adecuado de este tipo de JAR, hicieron una buena propuesta interesante para una solución:
Creación de un proyecto falso de Maven que adjunta un JAR preexistente como un artefacto principal, que se ejecuta en la instalación de POM: ejecución del archivo de instalación. Aquí hay un ejemplo de ese tipo de POM:
Pero para implementarlo, se debe cambiar la estructura del proyecto existente. Primero, debe tener en cuenta que para cada tipo de JAR debe crearse un proyecto (módulo) falso de Maven diferente. Y debe crearse un proyecto Maven principal que incluya todos los submódulos que son: todos los contenedores JAR y el proyecto principal existente. La estructura podría ser:
Cuando el padre se ejecuta a través de mvn: install o mvn: el empaquetado es forzado y se ejecutarán submódulos. Esto podría ser un inconveniente aquí, ya que la estructura del proyecto debería cambiarse, pero ofrece una solución no estática al final
fuente
Lo que me parece más simple es simplemente configurar su complemento compilador-maven para incluir sus tarros personalizados. Este ejemplo cargará cualquier archivo jar en un directorio lib.
fuente
says nothing to complile
!all classes are up to date
nothing to compile
porque ya no buscará*.java
más. Puede agregarlos nuevamente usando<include>**/*.java</include>
. Sin embargo, no hay éxito para mí en los frascosEl problema
systemPath
es que los frascos de las dependencias no se distribuirán a lo largo de sus artefactos como dependencias transitivas. Pruebe lo que he publicado aquí: ¿Es mejor Mavenize los archivos jar de su proyecto o ponerlos en WEB-INF / lib?Luego declare las dependencias como de costumbre.
Y por favor lea la nota de pie de página.
fuente
Una extraña solución que encontré:
usando Eclipse
aclamaciones, Balint
fuente
Si desea una solución rápida y sucia, puede hacer lo siguiente (aunque no lo recomiendo para nada, excepto para proyectos de prueba, Maven se quejará por completo de que esto no es apropiado).
Agregue una entrada de dependencia para cada archivo jar que necesite, preferiblemente con un script perl o algo similar y cópielo / péguelo en su archivo pom.
fuente
Una solución por lotes rápida y sucia (basada en la respuesta de Alex):
libs.bat
Ejecutarlo así:
libs.bat > libs.txt
. Luego abralibs.txt
y copie su contenido como dependencias.En mi caso, solo necesitaba las bibliotecas para compilar mi código, y esta solución fue la mejor para ese propósito.
fuente
Aunque no se ajusta exactamente a su problema, dejaré esto aquí. Mis requisitos fueron:
Hablemos primero de (3): simplemente tener los frascos en una carpeta y fusionarlos de alguna manera en el frasco final no funcionará aquí, ya que el IDE no lo entenderá. Esto significa que todas las bibliotecas deben instalarse correctamente. Sin embargo, no quiero que todos lo instalen usando "mvn install-file".
En mi proyecto necesitaba un metawidget. Aquí vamos:
Cada vez que tenga una nueva biblioteca, simplemente agregue una nueva ejecución y pídales a todos que vuelvan a construir el proyecto (puede mejorar este proceso con jerarquías de proyecto).
fuente
Para instalar el jar de terceros que no está en el repositorio de maven, use maven-install-plugin.
A continuación hay pasos:
A continuación se muestra el que usé para simonsite log4j
En pom.xml incluya la dependencia como se muestra a continuación
Ejecute el comando mvn clean install para crear su empaque
A continuación se muestra el enlace de referencia:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
fuente
Para aquellos que no encontraron una buena respuesta aquí, esto es lo que estamos haciendo para obtener un frasco con todas las dependencias necesarias. Esta respuesta ( https://stackoverflow.com/a/7623805/1084306 ) menciona el uso del complemento Maven Assembly pero en realidad no da un ejemplo en la respuesta. Y si no lee hasta el final de la respuesta (es bastante larga), puede que se la pierda. Agregar lo siguiente a su pom.xml generará
target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
fuente
Aludí a algún código de Python en un comentario a la respuesta de @alex lehmann's, así que lo publico aquí.
fuente
Esto no responde cómo agregarlos a su POM, y puede ser obvio, pero ¿solo agregaría el directorio lib a su trabajo classpath? Sé que eso es lo que hago cuando necesito un jar externo que no quiero agregar a mis repositorios de Maven.
Espero que esto ayude.
fuente
Lo que funciona en nuestro proyecto es lo que escribió Arquímedes Trajano, pero teníamos en nuestro .m2 / settings.xml algo como esto:
y * debe cambiarse a central. Entonces, si su respuesta no funciona para usted, debe verificar su settings.xml
fuente
Solo quería una solución rápida y sucia ... No pude ejecutar el script desde Nikita Volkov: error de sintaxis + requiere un formato estricto para los nombres de jar.
Hice este script Perl que funciona con cualquier formato para los nombres de archivo jar, y genera las dependencias en un xml para que pueda copiarse y pegarse directamente en un pom.
Si desea usarlo, asegúrese de comprender lo que está haciendo el script, es posible que deba cambiar el
lib
carpeta y el valor de lagroupId
oartifactId
...fuente
La solución para el enfoque del alcance = 'sistema' en Java:
fuente