Advertising:
Crear un Jar autocontenido con spring boot y maven
Cuando tenemos una aplicación con Spring Boot, podemos generar un tocho-jar (o war) que tenga dentro todas las dependencias que necesite, ficheros de configuración y recursos, de forma que se pueda arrancar con el comando simple java -jar ni-tocho.jar
, sin necesidad de configurar classpath o tener ficheros de dependencias junto a él. Un único fichero contiene todo lo necesario para hacerlo.
Veamos cómo
spring-boot-maven-plugin[edit]
Utilizando es sencillo. Basta añadir este plugin en nuestro fichero pom.xml y configurarlo
<project>
...
<build>
...
<plugins>
<!-- Para convertir el jar en ejecutable con java -jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.chuidiang.examples.RestMain</mainClass>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
Simplemente, en la sección build, hemos añadido el plugin spring-boot-maven-plugin. Indicamos que ejecute el goal repackage en la fase de package. Es decir, si ejecutamos nuestro habitual mvn package
, se ejecutará también el goal repackage. Esto cambiará el fichero jar de nuestro aplicación generado en el directorio taget añadiéndole la coletilla original y generando de nuevo el jar, pero con todo contenido ya dentro de él.
Un ejemplo[edit]
En rest-java-application tienes un ejemplo completo. No es más que una aplicación java con spring boot que levanta un servidor con web services REST.
Si te fijas en el pom.xml verás, aparte de las dependencias el plugin que acabamos de mencionar. Compilando con mvn package
y yendo al directorio target, veremos los dos ficheros jar
30/01/2021 22:12 <DIR> classes 30/01/2021 22:12 <DIR> generated-sources 30/01/2021 22:12 <DIR> maven-archiver 30/01/2021 22:12 <DIR> maven-status 30/01/2021 22:12 37.731.928 rest-java-application-1.0-SNAPSHOT.jar 30/01/2021 22:12 5.360 rest-java-application-1.0-SNAPSHOT.jar.original
El terminado en original es el jar de nuestra aplicación, tal cual lo generaría maven de una forma normal. El que no lleva original es el jar que podemos arrancar con
java -jar rest-java-application-1.0-SNAPSHOT.jar
Vemos que es muchísimo más grande que el otro. El motivo se intuye fácilmente, lleva dentro todos los jar de los que depende nuestra aplicación, que siendo spring-boot, no son precisamente pocos.