Tener un tarro de terceros incluido en el bote sombreado de Maven sin agregarlo al repository local

Ya encontré una respuesta aquí en Stack Overflow sobre cómo incluir un JAR de terceros en un proyecto sin instalarlo en un “repository local”:

¿Puedo agregar jar a maven 2 classpath build sin instalarlos?

Pero, cuando uso Maven Shade Plugin para crear un JAR que también incluye todas las dependencias del proyecto, el JAR de terceros no se incluye automáticamente.

¿Cómo puedo hacer que Maven Shade Plugin agregue un JAR de este tipo en el JAR sombreado?


Según la respuesta obtenida, lo hice funcionar. Lo que hice fue agregar este fragmento al principio de mi pom.xml:

  repo file://${basedir}/repo   

Luego agregué una dependencia para mi proyecto, también a pom.xml:

   dummy dummy 0.0.0 compile   

Y luego ejecuté una línea de comando para agregar un paquete a ‘repo’:

 mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file -Dfile=.jar -DgroupId=dummy -DartifactId=dummy -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/ 

(No estoy seguro de si la ruta de repos debe ser una ruta completa, pero no quería correr riesgos).

El contenido del subdirectorio repo ahora es:

 repo/dummy/dummy/0.0.0/dummy-0.0.0.jar repo/dummy/dummy/0.0.0/dummy-0.0.0.pom repo/dummy/dummy/maven-metadata-local.xml 

Ahora puedo verificar esto en el control de la versión, y no tengo dependencias locales o remotas.

Pero, cuando uso Maven Shade Plugin para crear un JAR que también incluye todas las dependencias del proyecto, el JAR de terceros no se incluye automáticamente.

Sí, porque se supone que las dependencias del ámbito del system siempre están presentes (esto es exactamente de lo system se trata el scope del system ), por lo que no se incluirán. La gente en realidad no entiende qué son las dependencias del scope del system , solo siguen abusando de ellas (sí, esto es abuso), y luego obtiene efectos secundarios y se pregunta por qué (como Brian señaló en su respuesta ).

Ya escribí muchas , muchas , muchas veces sobre esto aquí en SO y en el 99% de los casos, system deben evitar las dependencias del ámbito del system . Y repetiré lo que la mini guía de Dependency Scopes dice una vez más:

  • system : esta dependencia es necesaria en alguna fase del ciclo de vida de su proyecto, pero es específica del sistema. Se desaconseja el uso de este scope: se considera un tipo de función “avanzada” y solo se debe utilizar cuando se entiendan todas las ramificaciones de su uso, que puede ser extremadamente difícil si no imposible de cuantificar. Este scope, por definición, hace que su construcción no sea portátil. Puede ser necesario en ciertos casos de borde. El scope del sistema incluye el elemento que apunta a la ubicación física de esta dependencia en la máquina local. Por lo tanto, se usa para referirse a algún artefacto que se espera que esté presente en la máquina local dada y no en un repository; y cuya ruta puede variar de máquina a máquina. El elemento systemPath puede hacer referencia a variables de entorno en su ruta: ${JAVA_HOME} por ejemplo.

Entonces, en lugar de usar el scope del system , ya sea:

  • Agregue sus bibliotecas a su repository local a través de install:install-file . Esta es una manera rápida y sucia de hacer que las cosas funcionen, podría ser una opción si estás solo pero hace que tu comstackción no sea portátil.
  • Instale y ejecute un “repository empresarial” como Nexus, Archiva o Artifactory y agregue sus bibliotecas mediante deploy:deploy-file . Este es el escenario ideal .
  • Configure un repository basado en archivos como se describe en esta respuesta anterior y coloque sus bibliotecas allí. Este es el mejor compromiso si no tiene un repository corporativo, pero necesita trabajar en equipo y no quiere sacrificar la portabilidad.

Por favor, deja de usar el scope del system .

El plugin addjars de Maven resuelve este problema – ver

http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage

Usé para incluir mi lib con todos los flasks. es decir:

    ${project.basedir}  lib/*.jar      org.apache.maven.plugins maven-shade-plugin 2.3  false    package  shade