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
- MVN y tomcat
- Validación del código (linter): plugins para mvn. Nosotros usaremos checkstyle (mvn checkstyle:checkstyle)
- Compilación (mvn compile)
- Test unitarios (mvn test)
- Empaquetado (mvn package / mvn war:war)
- Documentación (mvn site / mvn javadoc:javadoc)
- 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
- mvn test-compile: Compiles the test source code.
- mvn idea:idea: generate project files for IntelliJ IDEA or Eclipse.
- mvn release:perform: Performs a release build.
- mvn archetype:generate: This command is used to generate a new project from an archetype, which is a template for a project. This command is typically used to create new projects based on a specific pattern or structure.
- mvn dependency:tree: This command is used to display the dependencies of the project in a tree format. This command is typically used to understand the dependencies of the project and troubleshoot any issues.
Fuente: geek4geeks