La forma de trabajar de Mavan está basada en lo que se conoce como ciclo de vida (build lifecycle). Este concepto establece que el proceso de construcción y distribución de un proyecto está definido de forma precisa mediante la ejecución de una secuencia de fases (phases), las cuales siempre son llevadas a cabo en el mismo orden. Existen tres ciclos de vida en Maven, cada uno estructurado en una serie de fases concretas:

  • default, encargado de la construcción del proyecto
  • clean, para eliminar los resultados de construcciones previas realizadas
  • site, para generar un sitio web sobre el proyecto

Dentro de cada fase hay una serie de objetivos a realizar (goals) que contribuyen al proceso de configuración y construcción del proyecto mediante la ejecución de tareas concretas, las cuales pueden verse como las unidades básicas de trabajo a realizar. Los goals se agrupan en plugins, que es la forma que tiene Maven de organizar tareas relacionadas. La forma de llamar a un goal es pluginId:goalId.

Por ejemplo, el plugin compiler permite realizar labores de compilación, para lo que ofrece dos goals. Uno para compilar el código fuente del proyecto (compiler:compile) y otro para compilar el código de los test realizados (compiler:testCompile). Por tanto, un plugin puede contener diferentes goals que pueden ejecutarse en diferentes fases, incluso un mismo goal puede ser invocado en distintas fases. Además, si por algún motivo no hay ningún goal asociado a una fase, dicha fase no se ejecutará.

Un plugin también puede tener goals no asociados a ninguna fase que pueden ser invocados de forma directa al margen del ciclo de vida. Por ejemplo, mvn archetype:generate ejecuta el goal generate del plugin archetype, que sirve para crear un nuevo proyecto Maven.

La ejecución de fases y goals se realizará en función del orden de invocación que realicemos. Por ejemplo, el comando mvn clean dependency:copy-dependencies package ejecutaría primero la fase clean del ciclo de vida clean, ejecutándose todas la fases previas a la fase clean. Después se ejecutaría el goal copy-dependencies del plugin dependency y finalmente se ejecutaría la fase package del ciclo de vida por defecto, ejecutándose todas la fases previas del mismo mediante los goals asociados en cada una de ellas.

Podemos ejecutar los goals que queramos invocándolos directamente pero generalmente es más sencillo hacer una llamada a una fase concreta, ya que se encargará de ejecutar automáticamente todos los goals vinculados a las fases que la preceden. En lugar de

mvn resources:resources \
compiler:compile \
resources:testResources \
compiler:testCompile \
surefire:test \
jar:jar \
install:install

es más sencillo

mvn install

Configuración de plugins y goals

Los goals asociados a las diferentes fases también pueden variar en función del tipo de empaquetamiento que realice el proyecto: jar, war, ear o pom (por defecto se utiliza pom). Por ejemplo, en la fase package se ejecutará el goal jar:jar para un proyecto de tipo jar, mientras que para uno de tipo war se ejecutará war:war, que es un goal diferente perteneciente a otro plugin distinto. Por tanto, según el tipo de empaquetamiento utilizado ya estamos configurando nuestro proyecto para utlizar unos plugins determinados por defecto.

La otra forma de realizar la configuración de los plugins es en el fichero pom del proyecto:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        ...
        [resto de etiquetas de configuración]
      </plugin>
      ...
    <plugins>
    ...
  </build>
  ...
</project> 

Por su parte, los goals se pueden configurar mediante parámetros que pueden ser pasados por línea de comandos o siendo definidos en el fichero POM. Por ejemplo, el goal test del plugin Surefire, usado para ejecutar los test unitarios de una aplicación, tiene la propiedad skipTests, que permite cancelar la ejecución de los tests. Puede indicarse en la línea de comandos

mvn clean install -DskipTests

o en el fichero pom

<project>
  ...
  <build>
    ...
    <plugins>
	  ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
	  ...
    </plugins>
	...
  </build>
  ...
</project>



Más información: Introduction to the Build Lifecycle