Skip to content

Maven

Workflow completo

  1. Validación del código (linter): plugins para mvn. Nosotros usaremos checkstyle (mvn checkstyle:checkstyle)
  2. Compilación (mvn compile)
  3. Test unitarios (mvn test)
  4. Empaquetado (mvn package o mvn war:war): para generar jar o war
  5. Documentación (mvn site / mvn javadoc:javadoc)
  6. Instalación (mvn install): install the package into the local repository, for use as a dependency in other projects locally.
  7. Despliegue (mvn deploy): copies the final package to the remote repository for sharing with other developers and projects.

Modelo de objetos de proyecto -POM- 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 package con dependencias

A veces necesitamos incluir las librerías utilizadas, por ejemplo el driver de conexión a la base de datos.

Para ello utilizaremos el plugin maven-assembly-plugin:

<dependencies>
    <!-- otras dependencias -->
    <!-- Jar sin dependencias => https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>[3.4.0,)</version>
    </dependency>
    <!-- Jar con dependencias => https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>[3.7.1,)</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR: `mvn package` -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>iescastelar.Principal</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- Build an executable JAR con dependencias: `mvn assembly:single` -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>iescastelar.Principal</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
  </build>

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 otro lado el pom.xml:

<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.

Completo

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

Fuentes: