Title: Flujo de trabajo continuo con Maven

Author: Luis Ferreira

Date: 9 de enero de 2025

Flujo de trabajo continuo con Maven

Autor: Luis Ferreira

Date: 9 de enero de 2025

Workflow completo

  1. MVN y tomcat
  2. Validación del código (linter): plugins para mvn. Nosotros usaremos checkstyle (mvn checkstyle:checkstyle)
  3. Compilación (mvn compile)
  4. Test unitarios (mvn test)
  5. Empaquetado (mvn package / mvn war:war)
  6. Documentación (mvn site / mvn javadoc:javadoc)
  7. Instalación/Despliegue (mvn ...)

pom.xml base

Partimos del pom.xml base generado por el IDE y retocado con algunos elementos mínimos:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.iescastelar.App</groupId>
    <artifactId>nombre-artefacto</artifactId>
    <version>0.1</version>
    <name>Nombre de la Clase</name>
    <description>
        Breve descripción de la app
    </description>

    <properties>
        <jdk.version>21</jdk.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>${jdk.version}</maven.compiler.source>
        <maven.compiler.target>${jdk.version}</maven.compiler.target>
    </properties>

</project>

mvn clean

mvn clean: Cleans the project and removes all files generated by the previous build.

mvn validate

This step validates if the project structure is correct. For example – It checks if all the dependencies have been downloaded and are vailable in the local repository.

mvn chekcstyle:check

Además, realiza la validación de estilo mediante linters, esto es se revisa que el estilo del código se encuentre dentro de las premisas de la “empresa”, p.e. Google Java Style Guide o la original Code Conventions for the Java TM Programming Language de Sun Microsystems

Tenemos 2 opciones para integrarlo en nuestro pom.xml: obligatorio u opcional.

Obligatorio

Se ejecutará en el flujo normal de trabajo, fallando desde el validate, integrando el plugin dentro de la sección <build><plugins> del pom:

<!-- checkstyle -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <configLocation>src/main/resources/sun_checkstyle.xml</configLocation>
                    <encoding>UTF-8</encoding>
                    <consoleOutput>true</consoleOutput>
                    <failsOnError>true</failsOnError>
                    <linkXRef>false</linkXRef>
                </configuration>
                <executions>
                    <execution>
                        <id>validate</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Opcional como report:

Lo tendremos que llamar expresamente mediante mvn checkstyle:check tras añadir el reporting al pom:

    <reporting>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>3.3.1</version>
          <reportSets>
            <reportSet>
              <reports>
                <report>checkstyle</report>
              </reports>
            </reportSet>
          </reportSets>
        </plugin>
      </plugins>
    </reporting>

También lo podemos ejecutar como herramienta externa.

mvn compile

Este es el elemento principal de mvn por lo que a priori no requiere nada para funcionar, pero podemos configurar algunas cosas interesantes.

Por ejemplo el JDK y codificación a utilizar:

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

Ahora, para añadir parámetros de compilación añadiremos un plugin en el <build><plugins> del pom:

<!-- compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.12.1</version>
                <!--<version>${compiler.plugin.version}</version>-->
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <!-- other configuration -->
                    <compilerArgs>
                        <arg>-Xlint:unchecked</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

En esta sección podremos añadir los argumentos que estimemos necesararios

mvn test

Para los test, necesitaremos por un lado añadir la dependencia (si no lo hizo automágicamente el IDE), pero además, también el plugin surefire dentro de la sección build del pom:

<dependencies>
  <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>5.8.1</version>
      <scope>test</scope>
  </dependency>
  <!-- otras dependencias -->
</dependencies>
<build>
  <plugins>
    <!-- Test -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.0</version>
    </plugin>
    <!-- otos plugin de construcción -->
  </plugins>
</build>

mvn package

Para generar jar añadiremos a nuestro pom:

    <!-- Genera manifiesto y jar 
            Ubicar justo antes </project>
    -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>        
                <configuration>
                <archive>
                    <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>com.iescastelar.MainCalculadoraDePila</mainClass>
                    </manifest>
                </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

Y si lo que quisiéramos fuera un war utilizaríamos el subcomando mvn package war:war.

Podemos obtener más información con mvn package jar:help y mvn package war:help.

mvn verify

This step runs checks to verify that the project is valid and meets the quality standards and it runs the integration tests for the project.

mvn install

mvn:install copies your packaged Maven module to your local repository (by default, in ~/.m2/repository), to be accessed by other local Maven builds.

Fuera del ámbito de este documento.

mvn site

Genera la documentación del proyecto.

Fuera del ámbito de este documento.

mvn deploy

mvn:deploy uploads your packaged Maven module to another (usually remote) repository, to be accessed by other, not necessarily local, Maven builds.

Aquí se complica un poco ya que necesitamos modificar el archivo de configuración de nuestro tomcat para darle permisos a maven para el despliegue del proyecto.

Credenciales de tomcat almacenadas en /etc/maven/settings.xml con:

<server>
  <id>Tomcat.Oracle</id>
  <username>usuario</username>
  <password>contraseña</password>
</server>

Y por otr lado el pom:

<plugin>
  <!-- despliegue automático con:
       mvn archetype:generate -DgroupId=com.iescastelar.echo -DartifactId=war-deploy -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

       Requiere modificar las credenciales almacenadas en /etc/maven/settings.xml con:
       <server>
         <id>Tomcat.Oracle</id>
         <username>usuario</username>
         <password>contraseña</password>
       </server>
  -->
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
      <url>http://192.168.10.202:8888/manager/text</url>
      <server>Tomcat.Oracle</server>
      <path>/myapp</path>
  </configuration>
</plugin>

Donde tendremos que sustituir la IP:PUERTO por la IP o el FQDN y el puerto de nuestro servidor tomcat, y la ruta correspondiente.

Otros comandos de maven

Fuente: geek4geeks

Fuentes: