¿Diferencia entre maven-assembly-plugin, maven-jar-plugin y maven-shade-plugin?

4 minutos de lectura

Avatar de usuario de ilovejavaAJ
ilovejavaAJ

Soy un principiante en maven y ahora estoy confundido con la diferencia entre los siguientes 3 complementos de Maven:

  • maven-assembly-plugin
  • maven-jar-plugin
  • maven-shade-plugin

¿Todos estos crean archivos jar? Si es así, ¿cuál es la diferencia entre los archivos Jar que crean? ¿Cuál es el propósito de cada complemento y en qué contexto debe usarse cada uno?

  • Esto es realmente demasiado amplio para responder. Eche un vistazo a la documentación de cada complemento para ver lo que hace. También hay ejemplos en los documentos.

    – Tunaki

    24 de julio de 2016 a las 12:03

  • En mi humilde opinión, esta es una buena pregunta. Para un novato (o muchos expertos, para el caso) esta elección es confusa. Y sí, ¿los documentos han sido suficientes para cada cosa? No había necesidad de SO en primer lugar.

    – Raúl

    15 de noviembre de 2016 a las 12:46

avatar de usuario de secfree
libre de segun

  1. maven-jar-plugin: este complemento proporciona la capacidad de crear y firmar archivos JAR. Pero solo compila los archivos Java bajo src/main/java y src/main/resources/. No incluye los archivos JAR de dependencias.
  2. maven-assembly-plugin: este complemento extrae todos los archivos JAR de dependencia en clases sin formato y los agrupa. También se puede usar para construir un JAR ejecutable especificando la clase principal. Funciona solo en proyectos con menos dependencias; para proyectos grandes con muchas dependencias, causará conflictos en los nombres de las clases de Java.
  3. maven-shade-plugin: empaqueta todas las dependencias en un uber-JAR. También se puede usar para construir un JAR ejecutable especificando la clase principal. Este complemento es particularmente útil ya que fusiona el contenido de archivos específicos en lugar de sobrescribirlos por clases de reubicación. Esto es necesario cuando hay archivos de recursos que tienen el mismo nombre en los archivos JAR y el complemento intenta empaquetar todos los archivos de recursos juntos.

Referirse: comparación: tarro de complemento maven, ensamblaje, sombra

  • large project with many dependencies, it will cause Java class name conflict issue. Entonces, ¿cómo lidiar con estos casos entonces?

    –Michel Feinstein

    16 de diciembre de 2018 a las 14:27

  • @mFeinstein en ese caso, debe usar maven-shade-plugin, puede encontrar más detalles en el enlace ya pegado para “Reubicación de clases” arriba

    – polainas

    26 de diciembre de 2018 a las 9:33

  • Todavía tengo problemas para ver la diferencia entre ensamblar y sombrear, ya que ambos parecen permitir la producción de un súper tarro que contiene todas las dependencias. ¿Estoy en lo cierto al suponer que el ensamblaje ensambla ciegamente todo en un solo contenedor, lo que puede generar conflictos entre diferentes versiones del mismo archivo, y esa sombra le brinda más control para resolver ese tipo de conflicto? Gracias.

    – Alain Désilets

    24 de junio de 2022 a las 11:48

Complemento de tarro

Veamos qué puede decir el siguiente comando.

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-jar-plugin

Tiene 3 objetivos, help, jar y test-jar. Creo que usted está principalmente interesado en el jar objetivo, que según la descripción hace lo siguiente:

Cree un JAR a partir del proyecto actual.

Como nota al margen, ejecutar mvn help:effective-pom en un proyecto con empaque configurado para jarmuestra que este complemento se configura automáticamente y se ejecuta durante el package fase.

  <plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase>package</phase>
        <goals>
          <goal>jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Complemento de ensamblaje

Este tiene un propósito diferente. Tiene 8 objetivos, pero 6 de ellos están obsoletos. Así que aparte de la help objetivo, esto nos deja con el single meta.

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-assembly-plugin

Ensamble un paquete de aplicaciones o una distribución a partir de un descriptor de ensamblado. Este objetivo es adecuado para enlazar con el ciclo de vida o llamar directamente desde la línea de comandos (siempre que todos los archivos necesarios estén disponibles antes de que comience la compilación, o sean producidos por otro objetivo especificado antes de este en la línea de comandos).

Puede usar el complemento de ensamblaje cuando desee entregar más que el artefacto de su proyecto (JAR, WAR, etc.), pero la configuración va en otro archivo.

Complemento de sombra

La descripción del objetivo principal es un poco decepcionante.

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-shade-plugin

Mojo que realiza el sombreado delegando al componente Shader.

La mayoría de las veces, desea usar este complemento si desea producir un uber-jar, que es su artefacto en un JAR con todas sus dependencias transitivas en él.

Básicamente, si está creando una biblioteca, se quedará con el complemento JAR predeterminado. Si está creando una aplicación, podría considerar usar el complemento de sombra, aunque para mí, es un poco rápido y sucio. Si uber-jar no es de su gusto o la distribución no puede caber dentro de un solo JAR (configuración externa, dependencias nativas, etc.), entonces debe optar por el complemento de ensamblaje.

¿Ha sido útil esta solución?