Spring Boot Maven Plugin

De ChuWiki


Cuando tenemos un proyecto Maven con Spring Boot, podemos generar un 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 mi.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[editar]

Utilizando es sencillo. Basta añadir este plugin en nuestro fichero pom.xml.

<project>
   ...
   <build>
        ...
        <plugins>
	    <!-- Para convertir el jar en ejecutable con java -jar -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            ...
        </plugins>
    </build>
</project>

Cuando generemos el jar con maven, con el comando "mvn package", este Plugin buscará automáticamente la clase "main" de nuestro proyecto Spring Boot y añadirá al fichero "jar" todo lo necesario para que se pueda ejecutar directamente.

Veremos que en el directorio "target", se crean dos "jar"

04/11/2023  13:09         9.721.178 maven-spring-boot-0.0.1-SNAPSHOT.jar
04/11/2023  13:09             3.000 maven-spring-boot-0.0.1-SNAPSHOT.jar.original

Vemos el "original", de pequeño tamaño y que es el que genera Maven por defecto. El plugin spring-boot-maven-plugin lo conserva añadiéndole el apellido ".original". El otro "jar", el de más tamaño, es el que genera el plugin y tiene dentro todas las dependencias y lo neceario para ser un ejecutable java autocontenido. Podemos arrancarlo con

java -jar maven-spring-boot-0.0.1-SNAPSHOT.jar

Varios main de Spring Boot en el proyecto[editar]

Si tenemos en el proyecto varios main, porque nos interese arrancar uno u otro, o los dos a la vez, spring-boot-maven-plugin necesita algo de configuración. En concreto, decirle cual es el main que tiene que arrancar. La configuración se pondría de la siguiente manera.

<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.MiMainDeSpringBoot</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
    </build>
</project>

Añadimos al plugin spring-boot-maven-plugin un apartado <executions>. Indicamos que ejecute el goal repackage, propio del plugin, en la fase de package. Es decir, si ejecutamos nuestro habitual mvn package, se ejecutará también el goal repackage. Y en la parte de <configuration>, ponemos la clase con el main que queramos que sea la que arranque al ejecutra el jar.