sábado, 26 de mayo de 2012

UCDetector un detector de código muerto JAVA


Le realidad es que navegando por la red encontré esta herramienta para programadores java que puede ser útil.

UCDetector

Es un plugin de Eclipse para detectar código Java muerto. UCDetector a diferencia de PMD es capaz de detectar clases públicas, métodos públicos y atributos sin referencias.

Procedamos a realizar su instalación y a probar algunas de sus virtudes.
Nota: Esto es un detector por lo que toda acción que se realice sobre las indicaciones de UCDetector debe ser analizada su necesidad para entender si es correcta su afirmación de código innecesario.
Para instalarlo debemos entrar a eclipse e instalar desde


Finalizada la instalación realizaremos una prueba para mostrar su funcionamiento.

No solicita autorización para su instalación a la que responderemos de manera afirmativa.




En primera instancia vamos a crear un proyecto java



Creamos la clase principal

Este el código de la clase pruebaCorrector





public class pruebaCorrector {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
       System.out.println("Hola mundo");
       
 }
 
 String Metodosinllamada()
 {  
  return "No te llama nadie";
 }

}


Como podrán ver solo definimos un método que no tiene referencia activa para la prueba.

Ahora este código se ejecuta sin problema, pero la realidad que no es útil a los fines de optimización dado que tenemos código muerto sin uso.

Miremos como nos permite trabajar desde eclipse.

Es simple nos paramos sobre la clase y hacemos botón derecho y podremos ver la opción del corrector.



podremos analizar los resultados del control desde eclipse 




No se debe olvidar que los problemas indicados por UCDetector son sugerencias, antes de cambiar/eliminar el código debemos estar seguros, ya que UCDetector no es capaz de identificar las referencias por Reflection, Spring, jars externos,

Creando , Compilando y Empaquetando Maven



Lo loco es que podríamos trasladar a Maven por su funcionamiento a diferentes ocasiones de la vida real y podríamos encontrar similitud sin problemas.


Por un lado en artículos anteriores mencionamos que Maven nos ayudaría en la construcción de proyectos, para esto utiliza propotipos o Archetypes son modelos estándar.


Maven pone a nuestra disposición una variedad de archetypes, desde algunos muy sencillos hasta algunos con gran complejidad para poder construir sitios Web, aplicaciones Web, etc.


Como toda la lógica de Maven, los archetypes también son otorgados por medio de un plugin llamado “ARCHETYPE” y con sólo ejecutar por consola el goal “mvn archetype:create” de este plugin y darle algunos parámetros necesarios será suficiente para construir un proyecto en base a uno de los prototipos a nuestra disposición.


Por otro lado hablamos que nos  brinda la posibilidad de mantener una descripción exacta de nuestro proyecto, incluyendo desde su nombre y su destino final hasta todas sus dependencias, librerías y goals a ejecutar en cada una de las fases de los diferentes ciclos de vida, el POM (Proyect Object Model) es, como su nombre lo indica, un modelo de nuestro proyecto. Brinda toda la información necesaria acerca de nuestro proyecto de forma tal que Maven sepa interpretarla.


En su concepto práctico, el POM (pom.xml) es el archivo de configuración de Maven. Es el XML que Maven sabe interpretar y analizar.


Todo lo hablado hasta el momento  se resumen en simples líneas agregadas a éste archivo XML, que tendremos que incorporar en el directorio raíz de nuestro proyecto.


El POM nos permite definir entre otras cosas, identificación única del proyecto, dependencias, repositorios remotos, plugins, archivos destino, etc.


Pero la realidad es que estamos llegando al momento de la verdad y con esto quiero decir que la practica que nos arrojara los conceptos que faltan del funcionamiento de Maven.


Realizada la instalación de Maven, el paso siguiente es crear la estructura básica de trabajo Maven.


Para esto creamos un directorio que en mi caso llamare Curso_maven.


Desde el directorio ejecutaremos el siguiente comando.

El primer paso que podemos hacer con maven es crear un proyecto desde cero. El comando de maven que tenemos que ejecutar es


mvn archetype:create -DgroupId=organizacion.paquetes -DartifactId=miproyecto

La primera vez que ejecutemos maven, creará un repositorio local en tu disco duro. En concreto, creará la carpeta .m2 en la carpeta home del usuario. En ella se guardarán todos los artefactos que maneje maven. Cuando instalemos al manejado desde Maven, este quedara registrado en el repositorio, pero esto lo veremos con mayor detalle mas adelante.

GroupId: Es la compañía, organización, o equipo al que pertenece este proyecto. Una convención utilizada para el “groupId” es utilizar al comienzo el nombre de dominio de la organización. Ejemplo, un proyecto de apache, tendría como groupId, “org.apache”


ArtifactId: Es el identificador único de este proyecto dentro del grupo especificado en el groupId. Siguiendo con el ejemplo, Apache tiene una gran cantidad de proyectos distintos todos bajo el groupId “org.apache”, pero cada uno con su nombre único.

Una vez ejecutado este comando, Maven empezará a bajarse cosas de internet cuando lo ejecutemos por primera vez (en los próximos proyectos ya no necesita bajarse nada) y creará una esctructura de directorios y ficheros como la siguiente



















al finalizar su ejecución nos crea una estructura de directorio como la siguiente.

miproyecto
+---src
¦    +---main
¦    ¦   +---java         //Para nuestros fuentes
¦    ¦       +---organizacion
¦    ¦           +---paquetes
¦    ¦               +---App.java
¦    +---test
¦        +---java         //Para test de Junit
¦            +---organizacion
¦                +---paquetes
¦                    +---AppTest.java
+---pom.xml

Dentro un fichero pom.xml que es un fichero que contiene datos de configuración de nuestro proyecto, como dependencias con otros jar, tipos de informes que queremos en la página web de nuestro proyecto, etc.. Inicialmente contiene una serie de cosas por defecto que podremos cambiar si lo deseamos.

Crea dos subdirectorios, uno src y otro test. Dentro de src debemos meter todo lo que sean fuentes y ficheros de configuración o datos propios del proyecto. En la parte de test debemos meter todos nuestros fuentes de prueba, clases de test de JUnit, ficheros de datos o de configuración de pruebas, etc. Es decir, en src va lo que es del proyecto y en test lo que nos ayude a probar el proyecto, pero no sea propio del proyecto.

Si vemos el fichero pom.xml de nuestro proyecto recién creado vemos lo siguiente

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>organizacion.paquetes</groupId>
  <artifactId>miproyecto</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>miproyecto</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Pero analicemos un poco el archivo POM para entenderlo un poco mas, un artefacto es un componente de software que podemos incluir en un proyecto como dependencia. Normalmente será un jar, pero podría ser de otro tipo, como un war por ejemplo. Los artefactos pueden tener dependencias entre sí, por lo tanto, si incluimos un artefacto en un proyecto, también obtendremos sus dependencias.


En el ejemplo por defecto que genera podemos notar que registra:

  • La información de base del manejado base del proyecto.
  • Identifica el encoding para la ejecución.
  • Proporciona información de las dependencias.

Un grupo es un conjunto de artefactos. Es una manera de organizarlos. Así por ejemplo todos los artefactos de Spring Framewok se encuentran en el grupo org.springframework.
Veamos un ejemplo:
<dependency>
 <groupid>org.springframework</groupid>
 <artifactid>spring-orm</artifactid>
 <version>3.0.5.RELEASE</version>
 <scope>runtime</scope>
</dependency>

Esta es la manera de declarar una dependencia de nuestro proyecto con un artefacto. Se indica el identificador de grupo, el identificador del artefacto y la versión.


El scope sirve para indicar el alcance de nuestra dependencia y su transitividad. Hay 6 tipos:
  • compile: es la que tenemos por defecto sino especificamos scope. Indica que la dependencia es necesaria para compilar. La dependencia además se propaga en los proyectos dependientes.
  • provided: Es como la anterior, pero esperas que el contenedor ya tenga esa libreria. Un claro ejemplo es cuando desplegamos en un servidor de aplicaciones, que por defecto, tiene bastantes librerías que utilizaremos en el proyecto, así que no necesitamos desplegar la dependencia.
  • runtime: La dependencia es necesaria en tiempo de ejecución pero no es necesaria para compilar.
  • test: La dependencia es solo para testing que es una de las fases de compilación con maven. JUnit es un claro ejemplo de esto.
  • system: Es como provided pero tienes que incluir la dependencia explicitamente. Maven no buscará este artefacto en tu repositorio local. Habrá que especificar la ruta de la dependencia mediante la etiqueta 
  • import: este solo se usa en la sección dependencyManagement. Lo explicaré en otro artículo sobre transitividad de dependencias.

Por consiguiente si tuviéramos que agregar nuevos artefactos a nuevos proyecto de ejemplo de de seguro deberíamos agregar nuevas dependencias.

Pero continuemos analizando la generación inicial del proyecto Maven que tenemos como caso de estudio.


Este es el código fuente del App.java
package organizacion.paquetes;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

Nota: Como podemos observar no hay mucha logica solo imprime un mensaje por pantalla

Este el el código fuente del AppTest.java, archivo para las pruebas de Junit.
package organizacion.paquetes;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Unit test for simple App.
 */
public class AppTest 
    extends TestCase
{
    /**
     * Create the test case
     *
     * @param testName name of the test case
     */
    public AppTest( String testName )
    {
        super( testName );
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite()
    {
        return new TestSuite( AppTest.class );
    }

    /**
     * Rigourous Test :-)
     */
    public void testApp()
    {
        assertTrue( true );
    }
}


Nota: Contiene los métodos necesarios para las pruebas del codigo fuente a probar.

Ahora ya habiendo analizado la generación de Maven, la pregunta es como realizamos acciones sobre el proyecto en cuestión. Aquí es donde introducimos el concepto de GOAL.


Un Goal no es mas que un comando que recibe maven como parámetro para que haga algo. La sintaxis sería:

mvn plugin:comando

Maven tiene una arquitectura de plugins, para poder ampliar su funcionalidad, aparte de los que ya trae por defecto.
Ejemplos de goals serían:
  • mvn clean:clean (o mvn clean): limpia todas las clases compiladas del proyecto.
  • mvn compile: compila el proyecto
  • mvn package: empaqueta el proyecto (si es un proyecto java simple, genera un jar, si es un proyecto web, un war, etc…)
  • mvn install: instala el artefacto en el repositorio local (/Users/home/.m2)


Ahora desde dentro del directorio del proyecto ejemplo de estudio y para retomar la practica,  compilaremos con Maven con el siguiente comando.

mvn compile

Nota: con esta acción Maven genero los archivos class y agrego un nuevo directorio target para este fin.













A continuación generaremos el empaquetado jar con el siguiente comando en el directorio del proyecto.

mvn package





Nota: donde podemos notar que en la consola nos indica la ruta donde genero el archivo JAR y casualmente es en la raiz del directorio target de la compilación.


ahora la prueba final es ejecutar este manejado desde la linea de comando para obtener la implementacion que en nuestro caso seria un simple mensaje por pantalla.

java -cp target/miproyecto-1.0-SNAPSHOT.jar organizacion.paquetes.App


y nuestro resultado final sera.












por dios, realice todo el proceso de creación de un proyecto, podría haber codificado funcionalidad desde un block de notas, compile el proyecto y genere el empaquetado sin tocar alguna ide ?? Fantástico.


viernes, 25 de mayo de 2012

Instalación de Maven en Windows 7


En este articulo vamos abordar la instalacion de Maven en windows 7, en primera instancia iremos a la pagina oficial de Maven para su descarga.

El link de la pagina oficial es http://maven.apache.org/ 








 Realizada la descarga:


Descomprir el zip y colocar la carpeta en una ruta de facil acceso.




Procedamos con la instalacion, Maven apoya su funcionamiento en la existencia de 2 variables de sistemas importantes.

  1. Por un lado la variable JAVA_HOME que apunta a la ruta donde se encuentra instalada la versión de JDK que debería estar instalada en la maquina.
  2. Por otro lado debemos realizar una modificación a la variable path,  que es donde debemos agregar la referencia del directorio bin del directorio de instalacion de maven y la referencia bin del JDK. 


Creando la variable JAVA_HOME

Si estas variable no existe en el sistema, deberemos crearla.

Deberemos ir a

Equipo -> Propiedades 


 Vamos a Configuración avanzada de sistemas



Luego a Variable de entorno 



Seleccionamos Nueva variable de sistemas



Nota: se debe crear la variable JAVA_HOME apuntando al path donde se encuentra instalado el JDK.

Modificando la variable de sistema PATH




A la variable existente PATH  debemos agregar lo siguiente

;C:\apache-maven-3.0.4\bin;%JAVA_HOME%\bin

Nota: Donde hacemos referencia al directorio bin de maven y al directorio bin del JDK.
Para finalizar podemos salir a una consola de comando y verificar la instalacion, ejecutando el comando mvn –version que nos indicara la version de Maven que instalamos.




Entendiendo  Apache Maven

Podríamos decir que Maven es una herramienta que sirve para gestionar nuestro proyecto software de tecnología JAVA en distintas fases de éste. Maven nos permite desde compilar un proyecto hasta generar una serie de acciones sobre el mismo.

Maven nacio con el proposito de simplificar el proceso del build de un projecto software. 


En nuestros proyectos java siempre tenemos varias tareas que realizar. La primera suele ser crear una estructura de directorios para nuestro proyecto, con un hueco para los fuentes, otro para iconos, ficheros de configuración o datos, directorio para dejar los .class o el .jar, para dejar el javadoc, etc.

Después, tenemos más tareas que realizamos con cierta frecuencia, como borrar los .class, compilar, generar la documentción de javadoc, el jar, incluso generar documentación web para publicar nuestro trabajo. Posiblemente acabemos haciendo algunos scripts o ficheros .bat para todas estas tareas.

Si nuestro programa es grande, incluso es posible que dependamos de otros jar externos, como drivers de base de datos, JUnit para clases de test, log4j para nuestra salida de log, etc.  Tendremos que copiar todos esto jar externos en algún sitio de nuestro proyecto e incluirlos.

Una primera herramienta que nos ayuda un poco con todo esto es ant. Sin embargo, con ant no tenemos todas estas tareas hechas y debemos rescribir posiblemente nuestro fichero build.xml (el de tareas que se ejecutan con ant) de un proyecto a otro. También tendremos que copiar los jar externos de los que dependemos.

Una herramienta que nos solucionara muchas complicaciones es maven, con comandos simples, nos crea una estructura de directorios para nuestro proyecto con sitio para los fuentes, los iconos, ficheros de configuración y datos, etc.

Si a maven le indicamos qué jar externos necesitamos, es capaz de ir a buscarlos a internet y descargarlos por nosotros, Sin necesidad prácticamente de configurar nada, maven sabe como borrar los .class, compilar, generar el jar, generar el javadoc y generar un documentación web con montones de informes (métricas, código duplicado, etc). 

Maven se encarga de pasar automáticamente nuestros test de prueba cuando compilamos. Incluso maven nos genera un zip de distribución en el que van todos los jar necesarios y ficheros de configuración de nuestro proyecto.


Manejo de dependencias y Repositorios

Una de las necesidades con las que nos encontramos ya sea al empezar un nuevo proyecto o durante el desarrollo del mismo, es la de tener que incorporar dependencias (librerías externas a nuestra aplicación y frameworks, entre otros).

Si bien la forma de manejar estas dependencias no era una tarea complicada, Maven nos brinda aun mayores facilidades para incorporarlas y organizarlas. Veremos que en lugar de tener replicadas las librerías en cada uno de nuestros proyectos pasaremos a tener un “lugar” único donde estarán almacenadas, haciendo así referencia a la ubicación donde se encuentran en lugar de tener una copia física en cada proyecto.

Uno de los beneficios de lo previamente mencionado es que no tendremos nuestras dependencias almacenadas en el mismo repositorio donde tenemos nuestro código (svn, cvs, perforce, etc) sino que las utilizaremos desde losrepositorios de Maven.

Veamos un ejemplo simple que nos ayudará a entender un poco más el manejo de dependencias que nos brinda Maven, pero solo en forma conceptual.

Al momento de necesitar de un framework nuevo, por ejemplo Hibernate, antes era necesario analizar qué dependencias tenía Hibernate, bajarlas e incluirlas manualmente en el proyecto. Era necesario analizar todas las librerías necesarias e incorporarlas a nuestro proyecto en forma manual. Maven en este caso nos brinda una gran ayuda simplificando ese proceso en solo dos pasos, elegir el framework a incorporar, ejemplo Hibernate, y luego declarar en la configuración de Maven la dependenciaMaven hará el resto. Se encargará de incorporar a nuestro proyecto todo lo necesario para que Hibernate funcione correctamente.

Para ir entendiendo de a poco cómo lograremos ésto, cabe mencionar que maven tiene un archivo de configuración que será relativo al proyecto en el que trabajemos, también mantiene una nomenclatura sobre cómo nombrar y versionar las dependencias, es así que partiendo de ciertos valores defaults resulta tan sencillo agregar una dependencia a nuestro proyecto.

Para poder soportar el esquema previamente mencionado Maven incorpora el concepto de repositorio de dependencias. El concepto principal es el de tener un único lugar donde ubicar las librerías, es así que encontraremos repositorios subidos a la Web que tendrán aquellas dependencias que se usan cotidianamente. De todos modos, Maven también creará un repositorio local en cada maquina donde se lo utilice con el fin de no bajar nuevamente una dependencia cada vez que la necesitemos. Este repositorio local es el “lugar” del que hablábamos al comienzo de este punto (una simple carpeta que será utilizada por Maven para guardar las librerías).

Es importante señalar que se pueden crear nuestros propios repositorios y configurar nuestros proyectos para que se comuniquen con ellos por medio de la Web, en los cuales podríamos incorporar todas las librerías que sabemos serán utilizadas.



Conociendo a los Obreros del Proceso

Si bien se define a Maven como una herramienta muy fuerte y completa, si entramos en detalle Maven no sabe hacer mucho mas que entender XMLs y delegar responsabilidades.

Maven se abstrajo de todas las tareas especificas, como ser build, compilaciones, y tantas otras tareas que son sustentables por si mismas, generando plugins para cada una de ellas.

El núcleo central de Maven se conforma de una serie de plugins que saben dedicarse a hacer tareas específicas, y que se mantienen centralizadamente, pero, y esta es la parte importante, se comparten universalmente en los mismos repositorios donde encontrábamos las dependencias.

Esta organización por medio de plugins genera en primer lugar que las distintas distribuciones de Maven sean livianas en tiempo de descarga, ya que el funcionamiento en si mismo se encuentra en los plugins en los repositorios y sólo se descargaran al ejecutar Maven por primera vez.

Pero la consecuencia mas importante es que nos permite reutilizar plugins creados por otros y mantenidos por otros con solo declararlos en el archivo de configuración de Maven. Y si una nueva funcionalidad aparece, con solo actualizar la versión en este archivo de configuración, obtendremos las actualizaciones disponibles.

Resumiendo este tema en un caso concreto, cada vez que le digamos a Maven que efectúe alguna tarea como ser que “ejecute los tests” o que “empaquete la aplicación” o muchas otras acciones que podremos pedirle, lo único que Maven hará será buscar el plugin que sabe cómo realizar la tarea especificada y decirle que la ejecute. Todo lo demás es responsabilidad de los diferentes plugins.

Ciclos de vida, Fases y Goals

Cuando logramos entender que Maven es un orquestador que utiliza entes que son los que saben realizar las tareas solicitadas, la pregunta seria como alcanza los diferentes objetivos.


Maven basa su funcionamiento en algo llamado ciclo de vida (Life cycle), un ciclo de vida es una secuencia organizada de fases (maven phases), a su vez una fase puede tener asociado uno o mas goals.


El concepto principal de contar con un Life cycle es el de tener una estructura común de pasos a seguir. 
Imaginemos éstos conceptos previamente mencionados (Life cycle, phases, goals) como una lista de instrucciones que están disponibles para ser ejecutadas por el usuario.
 Esta lista de instrucciones es independiente al proyecto. Si bien las instrucciones son las mismas para todos los proyectos, éstas podrían configurarse para hacer cosas específicas.


Pasemos a un ejemplo real y concreto de un ciclo de vida en Maven. Es importante mencionar que Maven tiene varios ciclos de vida pero para este primer ejemplo veremos el más sencillo de todos, ciclo de vida “Clean”.


Como dijimos un ciclo de vida tiene fases. En el caso del ciclo de vida “Clean” las fases que contiene son:
  1. pre-clean
  2. clean
  3. post-clean
Imaginemos que cada una de las fases nombradas tiene asociada una lógica específica, y nosotros queremos ejecutar la lógica asociada a la fase “pre-clean”. Para ésto bastará con ejecutar el comando “mvn pre-clean”, fíjense que lo único que hacemos es decirle a Maven que ejecute una fase específica.


Ahora bien, con antelación dijimos que las fases tenían un orden especifico, ¿cómo influye ésto al momento de ejecutar una fase en Maven?, sencillo, en el ejemplo donde le dijimos a Maven que ejecute “pre-clean” Maven se fijará en su lista de fases para el life-cycle asociado (la fase pre-clean está asociada al life-cycle “Clean”) qué fases tiene previas a la que nosotros indicamos y ejecutará desde la primera de la lista hasta llegar a la que nosotros especificamos. 
Todas las fases, en nuestro caso, fueron en realidad, solamente una: “pre-clean”. Pero observemos que si en el ejemplo anterior hubiésemos ejecutado “maven clean” le estaríamos indicando a Maven que ejecute su fase “clean” del life cicle asociado, pero en este caso buscaría en su lista de fases y como dijimos ejecutaría todas las previas también, por lo tanto el resultado de esa ejecución seria “pre-clean” y luego “clean”.


Con éste ejemplo cubrimos algunas cuestiones básicas como son la ejecución de tareas de Maven, el orden y precedencia de las fases, ahora agreguemos el concepto de Goals previamente mencionado.


Dijimos que Maven tenia plugins y que Maven por si solo no era nada mas que configuración y una especificación de cómo hacer las cosas, y que el “qué tengo que hacer” era responsabilidad de los diferentes plugins, es aquí donde entra en juego el concepto de goal, un goal es una meta o tarea especifica que tiene un plugin.


Básicamente los plugins realizan diferentes funciones y la forma de identificar y ejecutar cada una de ellas es a través de sus goals.


Ya tenemos un ciclo de vida que tiene un número de fases que se ejecutan en un orden. Por otro lado, plugins que conocen, contienen la lógica que vamos a ejecutar y que tienen goals específicos.


Puntualmente un goal se asocia a una fase esto quiere decir que si ejecutamos una fase Maven ejecutará todos los goals de los diferentes plugins que estén asociados a dicha fase.


En primer lugar una fase no ejecuta nada si no tiene un goal asociado ya que la lógica está en los plugins y no en las fases de Maven.


Otra cuestión interesante es que nosotros podemos decirle a Maven que ejecute una fase o un goal específico, la diferencia será que al decirle que ejecute una fase Maven tendrá en cuenta el ciclo de vida y ejecutará los goals de las fases previas antes de ejecutar los de la fase especificada, en cambio, al decirle que ejecute un goal simplemente ejecutara ese goal sin importar las fases anteriores ni ningún otro goal asociado a la fase especificada.


Veamos un ejemplo de lo mencionado como para ir entiendo un poco la nomenclatura y familiarizarnos con el “lenguaje” de Maven.


Sigamos usando el ciclo de vida Clean. Dijimos que todo pasa por los plugins es por ésto que Maven tiene una serie de plugins que realizan la mayoría de las tareas comunes al desarrollo de un proyecto.


El plugin que está asociado al ciclo de vida Clean es llamado casualmente “CLEAN” y este tiene un goal que se denomina “clean”. Este plugin cuando ejecutamos el goal clean lo que hace es borrar el directorio que Maven genera cuando hacemos un “build”.
Ahora veamos las dos formas de ejecutar el goal clean que teníamos.


La primera sería ejecutando la fase “clean” ya que el goal “clean” está asociado a la “fase clean” del ciclo de vida “Clean”, diciéndole a Maven que ejecute dicha fase (“mvn clean”) lo que hará será previamente ejecutar la fase pre-clean (es decir todos los goals que encuentre asociados a la fase pre-clean) y luego todos los goals asociados a la fase clean.


En el segundo caso al decirle a Maven que ejecute directamente el goal (“mvn clean:clean”) lo que hará será llamar al goal clean de la fase clean del ciclo de vida Clean del plugin CLEAN, sin chequear las fases previas, ni los demás goals asociados.


Veamos ahora un ciclo de vida un poco más complejo y con el que trabajaremos comúnmente.


El ciclo de vida por defecto de Maven

Este ciclo de vida define una serie de pasos que se consideran los comunes para el empaquetado de un proyecto.



Veamos la siguiente tabla (extraída del manual de referencia de Maven) con las fases de este ciclo de vida.
Lifecycle PhaseDescription
ValidateValidate the project is correct and all necessary information is available to complete a build
generate-sourcesGenerate any source code for inclusion in compilation
Process-sourcesProcess the source code, for example to filter any values
generate-resourcesGenerate resources for inclusion in the package
process-resourcesCopy and process the resources into the destination directory, ready for packaging
CompileCompile the source code of the project
Process-classesPost-process the generated files from compilation, for example to do bytecode
 enhancement on Java classes
generate-test-sourcesGenerate any test source code for inclusion in compilation
process-test-sourcesProcess the test source code, for example to filter any values
generate-test-resourcesCreate resources for testing
process-test-resourcesCopy and process the resources into the test destination directory
test-compileCompile the test source code into the test destination directory
TestRun tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed
prepare-packagePerform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package (coming in Maven 2.1+)
PackageTake the compiled code and package it in its distributable format, such as a JAR, WAR, or EAR
pre-integration-testPerform actions required before integration tests are executed. This may involve things such as setting up the required environment
integration-testProcess and deploy the package if necessary into an environment where integration tests can be run
post-integration-testPerform actions required after integration tests have been executed. This may include cleaning up the environment
VerifyRun any checks to verify the package is valid and meets quality criteria
InstallInstall the package into the local repository, for use as a dependency in other projects locally
DeployCopies the final package to the remote repository for sharing with other developers and projects (usually only relevant during a formal release)