martes, 18 de junio de 2019

Como crear un JAR con Maven con las dependencias incluidas

Intentando realizar un ´custom connnector´ de WSO2, me encontré con el problema de que tenia que crear un fichero .ZIP y que este incluyera todas las dependencias dentro. Si queremos crerar un Jar que tenga las dependencias incluidas podemos hacerlo de varias formas y aquí iremos explicando cada una. 
  • Con Maven Dependency Plugin
Con este plugin propiamente no vamos a incluir las librerias dentro del JAR, pero podremos exportar las dependencias a una carpeta e identificar facilmente todas las necesarias. Util cuando debemos incluirlas en un servidor, para el correcto funcionamiento de nuestro JAR. 

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.8</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
        <includeScope>runtime</includeScope>
      </configuration>
    </execution>
  </executions>
</plugin>
  • Con Maven Assembly Plugin y descriptorRef
A través del plugin 'assembly' podremos realizar un empaquetado final con más información y contenido que simplemente las clases compiladas. La forma mas sencilla de realizarlo a traves de este plugin es:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
</plugin>
  • Con Maven Assembly Plugin y los descriptor files
Al final, lo que hemos visto antes, no es más que una pre configuración de un descriptor file que viene por defecto con el plugin. A través de un descriptor file, podremos indicar una configuración más personalizada del plugin y podremos generar el fichero comprimible que deseemos de la forma que deseemos. 

Para ello deberemos incluir la siguiente seccion dentro de nuestro descriptor file:

<dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  • Con Maven Shade Plugin
Con este plugin tendremos una solucion parecida a la del assembly. Con la ventaja que nos permitira shaded las clases. Es decir, en un jar con muchas dependencias puede darse la existencia de clases con nombres iguales. Mientras que el plugin Assembly las sobreescribia, el Shade Plugin realiza una recolocacion de las mismas, evitando problemas del tipo NoClassDefFoundError or NoSuchMethodException. En este caso, la configuracion seria la siguiente:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
    </execution>
  </executions>
</plugin>

No hay comentarios:

Publicar un comentario