tutorial maven

35
TUTORIAL MAVEN v2.0.9 Escrito por: Ricardo Guerra ([email protected]) Este tutorial explica todo sobre Maven, en esta oportunidad la versión 2.0.9. Maven es un “Project Management Framework”, esto es, un Framework de gestión de proyectos de software. Esta muy buena herramienta nos puede ayudar en el proceso de creación de nuestro proyecto Java. ¿Cómo lo logra?, mediante el uso de los arquetipos de Maven, que son estructuras de proyecto predefinidas y reconocidas en un archivo xml (Pom.xml), que se generan mediante los plugins de Maven (Cada plugin de arquetipo relacionado a un Jars necesario). Además, los principales proyectos Open Source en Java, están utilizando cada día más el uso de Maven para su desarrollo, por lo que cada vez es más frecuente encontrar plugins de arquetipos para el desarrollo de aplicaciones. Maven da soluciones a tareas que abarcan desde la compilación hasta la distribución, despliegue y documentación de los proyectos. Se podría describir como “un sistema de estándares, un repositorio, y un software usado para manejar y describir proyectos. Define un ciclo de vida estándar para la construcción, prueba, y despliegue de componentes del proyecto. Proporciona un marco que permita la reutilización fácil de la lógica común de la estructura para todos los proyectos que siguen los estándares Maven. Maven, para ser compilado necesita de requerimiento el Internet ya que mediante unos comandos en consola (Posteriormente explicaremos), Maven lee los plugins de arquetipos escritos en el archivo Pom.xml y descarga las librerías necesarias en un repositorio predefinido para el almacenamiento de las librerías respectivas. También, Maven permite generar y versionar un Proyecto dentro de un War, ordenar y comprimir las librerías (Jars) utilizadas dentro de un .Zip, generar un completo JavaDoc de la aplicación, etc. Todo mediante códigos en

Upload: randy-aragon

Post on 08-Dec-2014

171 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Tutorial MAVEN

TUTORIAL MAVEN v2.0.9

Escrito por: Ricardo Guerra ([email protected])

Este tutorial explica todo sobre Maven, en esta oportunidad la versión 2.0.9.

Maven es un “Project Management Framework”, esto es, un Framework de gestión de proyectos de software. Esta muy buena herramienta nos puede ayudar en el proceso de creación de nuestro proyecto Java. ¿Cómo lo logra?, mediante el uso de los arquetipos de Maven, que son estructuras de proyecto predefinidas y reconocidas en un archivo xml (Pom.xml), que se generan mediante los plugins de Maven (Cada plugin de arquetipo relacionado a un Jars necesario). Además, los principales proyectos Open Source en Java, están utilizando cada día más el uso de Maven para su desarrollo, por lo que cada vez es más frecuente encontrar plugins de arquetipos para el desarrollo de aplicaciones.

Maven da soluciones a tareas que abarcan desde la compilación hasta la distribución, despliegue y documentación de los proyectos. Se podría describir como “un sistema de estándares, un repositorio, y un software usado para manejar y describir proyectos. Define un ciclo de vida estándar para la construcción, prueba, y despliegue de componentes del proyecto. Proporciona un marco que permita la reutilización fácil de la lógica común de la estructura para todos los proyectos que siguen los estándares Maven.

Maven, para ser compilado necesita de requerimiento el Internet ya que mediante unos comandos en consola (Posteriormente explicaremos), Maven lee los plugins de arquetipos escritos en el archivo Pom.xml y descarga las librerías necesarias en un repositorio predefinido para el almacenamiento de las librerías respectivas.

También, Maven permite generar y versionar un Proyecto dentro de un War, ordenar y comprimir las librerías (Jars) utilizadas dentro de un .Zip, generar un completo JavaDoc de la aplicación, etc. Todo mediante códigos en consola.

I.- REQUISITOS.Para este tutorial he utilizado Windows XP, Maven 2.0.9 y Eclipse 3.3. Si no es tu caso, probablemente puedas adaptar fácilmente el tutorial a lo que dispongas.

Maven 2.0.9, por ejemplo la distribución apache-maven-2.0.9-bin.zip.

Eclipse 3.2 correctamente instalado y con las herramientas de desarrollo web WST.

Tomcat 6, y configurado en el Eclipse para poder ejecutar aplicaciones en él.

Page 2: Tutorial MAVEN

Java JDK 1.6 instalado, y con la variable JAVA_HOME configurada correctamente.

Para la descargar de los ficheros de instalación:

http://maven.apache.org/download.html http://www.eclipse.org http://tomcat.apache.org/download-60.cgi http://developers.sun.com/downloads/

II.- CARACTERISTICAS.

Maven dispone por defecto de una serie de funcionalidades avanzadas, las cuales des-cribiremos a continuación. De todas formas hemos de tener en cuenta que Maven dispo-ne de un gran número de plugins que le otorgan un enorme valor añadido, además, aquel que quiera puede crear sus propios plugins.

Sobre las características disponibles, destacamos las siguientes:

Creación sencilla y ágil de un nuevo proyecto o módulo.

Estandarización de la estructura de un proyecto, y de las técnicas relacionadas con éste. De esta forma, se mejora la adaptación de los desarrolladores y la ho-mogeneización del software. Maven propone una estructura estándar de un pro-yecto: El proyecto se describe en su totalidad en el fichero pom.xml, y existe una localización estándar para el código fuente, los recursos, el código de la aplica-ción Web...

Maven incluye un potente mecanismo de gestión de las dependencias de un pro-yecto sobre librerías propias o de terceros. Gracias a la descripción de estas de-pendencias en el pom.xml, Maven puede realizar una serie de tareas útiles como actualizaciones automáticas (incluyendo la descarga de las librerías necesarias), y la resolución de dependencias transitivas (una librería depende de otra). Maven posibilita la reutilización de librerías propias.

Maven permite una sencilla gestión simultánea de varios proyectos.

Maven dispone de un enorme repositorio de librerías Open Source en constante actualización, de forma que los desarrolladores pueden acceder a las versiones más actualizadas de las mismas.

Maven es extensible, dispone de multitud de plugins y de la posibilidad de crea-ción de otros que necesitemos.

Nos proporciona un acceso inmediato a nuevas funcionalidades requiriendo un esfuerzo muy pequeño de configuración.

Integración con tareas ANT: aquellos grupos de desarrollo que ya dispongan de scripts ant podrán seguir utilizándolos.

Construcción basada en modelos: en función de la definición, Maven puede gene-rar diversos formatos de empaquetado de proyectos: WAR, EAR, JAR...

Generación de un portal Web del proyecto coherente con la descripción dada en el POM. En este portal Web se puede incluir la documentación del proyecto, infor-mes sobre el estado del proyecto, sobre la calidad del código… por ejemplo, los portales de cada producto de Apache están generados con Maven.

Gestión de releases y publicación. Maven se integra con sistemas de gestión de versiones (como CVS o SVN) y gestiona la publicación de releases.

Maven se basa en la invocación de una serie de objetivos o goals. Estos goals se invocan por línea de comandos (o desde un IDE como Eclipse) para realizar una tarea.Por ejemplo, “mvn site” es una ejecución al goal site, que crea un portal Web para el proyecto en función de su definición en el pom.xml. Para crear este portal, tendremos

Page 3: Tutorial MAVEN

que crear nuestro descriptor site.xml, en la carpeta src/site y ejecutar el comando ante -rior mvn site o mvn site-deploy si además de crear la Web queremos que se despliegue en algún sitio tras generarla. En la siguiente tabla especificamos las carpetas existentes:

En el fichero pom.xml se almacena toda la información necesaria para el ciclo de vida del proyecto: dependencias, plugins, repositorios de donde obtener estos, configuración de los informes. Además de estos datos, se pueden guardar otros como SCM del proyecto, equipo de desarrollo, listas de distribución, etc. Toda esta información puede ser publicada en el portal Web del proyecto generado con maven.

III.- INSTALACION DE MAVEN.3.1.- Descomprimir la carpeta descargada en una ubicación definida (En mi caso: D:\JAVA\MAVEN v2.0.9). 3.2.- Configurar las variables de entorno tanto para Maven y para Java Home, recordar que no debe contener espacios en blanco la ruta.

Probar la configuración que haya sigo reconocida en el sistema. mvn –ver

Page 4: Tutorial MAVEN

3.3.- Crear el repositorio donde se descargaran y almacenaran las librerías de Maven. (En mi caso: D:\JAVA\RepositorioMaven)

3.4.- Configurar el Maven para que reconozca el repositorio donde se almacenara las librerías descargadas. En mi caso acceder a la ruta: D:\JAVA\MAVEN v2.0.9\conf y abrir en el archivo ‘settings.xml’ y registrar la ruta de repositorio:

<localRepository>D:\JAVA\RepositorioMaven</localRepository>

3.5.- Configurar el repositorio ya registrado con Maven desde Eclipse v3.3. Windows/Preferences/Java/Build Path/Classpath Variables

La variable M2_REPO es una variable reconocida por Maven (No cambiarle el nombre para su registro)

Page 5: Tutorial MAVEN

IV.- CREACION DE UN PROYECTO JAVA CON MAVEN.Antes que nada recuerda que si deseas trabajar con Maven necesitas de una conexión de Internet.

4.1.- Se tiene que escoger el arquetipo que se va a utilizar para la creación del proyecto, para ello entramos a la página de Maven donde esta la lista de arquetipos. (http://docs.codehaus.org/display/MAVENUSER/Archetypes+List), con ellos podemos armar nuestro arquetipo a utilizar, para crear nuestro proyecto JAVA, en base a los siguientes parámetros.

archetype:create es el comando/plugin, o como se quiera llamar, de Maven para crear un proyecto. Por defecto crea un proyecto de Java normal (nada de aplicación web, aunque también se puede).

-DgroupId=org.java.prueba es el conjunto de proyectos al que pertenece nuestro proyecto. Por ejemplo, yo puedo meter todas mis clases de ejemplo en un grupo que llamaré "GrupoJavaMaven". Este nombre que pongamos aquí va a servir de paquete inicial para todas las clases del proyecto. Todos los pro -yectos Maven deben pertenecer a un grupo, aunque sea único para él, que se denominará groupId.

-DartifactId=EjemploMaven es el nombre que queramos dar a nuestro pro-yecto. Maven creará un directorio con este nombre y el Jar que genere para el proyecto tendrá también este nombre. Todos los proyectos Maven tienen un nombre para identificarlos, que se denomina artifactId.

4.2.- Ya explicada cada parte de la sentencia a utilizar, abrimos la consola y en la ruta donde queramos crear nuestro proyecto JAVA (En mi caso: D:\JAVA\WorkSpaceLocalhost\Maven), ingresamos la sentencia para crear un proyecto JAVA:

mvn archetype:create -DgroupId=GrupoJavaMaven -DartifactId=EjemploJavaMaven

Page 6: Tutorial MAVEN

4.3.- Luego de creado nuestro proyecto en la ruta designada, ingresamos dentro de la carpeta del proyecto creado “EjemploJavaMaven”, y ingresamos la siguiente codificación Maven. Para limpiar, construir, descargar y sea de reconocimiento para la IDE Eclipse el proyecto JAVA ya creado (Uno por uno).

mvn cleanmvn installmvn eclipse:cleanmvn eclipse:eclipsemvn -Dwtpversion=1.5 eclipse:eclipse

Page 7: Tutorial MAVEN

4.4.- Otra opción es poyarnos el Helper que da el MAVEN:

mvn archetype:generate

Podrá visualizar el listado de los arquetipos disponibles para la creación de proyectos Maven2. Ejemplo:

C:\>mvn archetype:generate[INFO] Scanning for projects...[INFO] Searching repository for plugin with prefix: 'archetype'.[INFO] ------------------------------------------------------------------------[INFO] Building Maven Default Project[INFO] task-segment: [archetype:generate] (aggregator-style)[INFO] ------------------------------------------------------------------------[INFO] Preparing archetype:generate[INFO] No goals needed for project - skipping[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.[INFO] Setting property: velocimacro.messages.on => 'false'.[INFO] Setting property: resource.loader => 'classpath'.[INFO] Setting property: resource.manager.logwhenfound => 'false'.[INFO] [archetype:generate]Choose archetype:1: internal -> appfuse-basic-jsf2: internal -> appfuse-basic-spring3: internal -> appfuse-basic-struts...10: internal -> maven-archetype-j2ee-simple...15: internal -> maven-archetype-quickstart16: internal -> maven-archetype-site-simple17: internal -> maven-archetype-site18: internal -> maven-archetype-webapp19: internal -> struts2-archetype-starter20: internal -> struts2-archetype-blank...36: internal -> wicket-archetype-quickstartChoose a number: (1/2/3/.../10/.../15/16/17/18/19/20/.../36) 15: : 18

La opción 18 es la que deberá elegir, ya que corresponde al proyecto de aplicación Web a crear. Luego MAVEN solicitara algunos datos mas, como puede observar a continuación:

Define value for groupId: : GrupoJavaMavenDefine value for artifactId: : EjemploJavaMavenDefine value for version: 1.0Define value for package: : org.java.bean

Solo restara entonces confirmar los datos anteriores:

Confirm properties configuration:groupId: GrupoJavaMavenartifactId: EjemploJavaMavenversion: 1.0package: org.java.beanY: :

Finalmente MAVEN creara el proyecto, mostrando el resultado de la operación como se muestra a continuación:

Page 8: Tutorial MAVEN

[INFO] ----------------------------------------------------------------------------[INFO] Using following parameters for creating OldArchetype: maven-archetype-webapp:1.0[INFO] ----------------------------------------------------------------------------[INFO] Parameter: groupId, Value: GrupoJavaMaven [INFO] Parameter: packageName, Value: org.java.bean[INFO] Parameter: version, Value: 1.0[INFO] Parameter: artifactId, Value: EjemploJavaMaven[INFO] ***** End of debug info from resources from generated POM ******[INFO] OldArchetype created in dir: C:\EjemploJavaMaven[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------[INFO] Total time: 0 minutes 17 seconds[INFO] Finished at: Sat Feb 14 13:22:47 ARST 2009[INFO] Final Memory: 8M/1016M[INFO] ------------------------------------------------------------------------

4.5.- Terminado esto, ya tenemos un proyecto JAVA con Maven creado y pasamos a importarlo desde Eclipse.

File>Import>Existing Projects into WorkSpace

4.6.- Se visualizara el Proyecto Java con un error (Al final se resolverá), creamos un Source Folder, que contendrá nuestras carpetas, según la arquitectura que manejemos.

Sobre el proyecto: New>Sorce Folder

Page 9: Tutorial MAVEN

4.7.- Vamos a relacionar el proyecto con el JDK. Sobre el proyecto: Properties>Java Build Path>Libraries>JRE System

Library, pulsar Edit y seleccionar el JDK respectivo.

4.8.- Aquí mismo en la pestaña Order and Export: Chekear todo y acomodar el orden de los Source Folders si se desea. Luego, Pulsar OK.

4.9.- Pulsar en la pestaña: Problems>Quick Fix

Page 10: Tutorial MAVEN

5.0.- Ejecutamos el proyecto en el Tomcat. Sobre el Proyecto: Run as>Run on Server

V.- PROCESOS QUE SE PUEDEN HACER CON MAVEN.Maven permite realizar procesos como generar un JavaDoc, un .War, un .Ear, un .Zip de todas las librerías (Jars) proyecto JAVA Utilizado etc.

5.1.- Compilación del Proyecto: Maven permite compilar de forma sencilla, basta con ingresando a la raíz del proyecto JAVA, desde consola y escribir:

mvn compile

Esto creará un directorio target, debajo un subdirectorio EjemploMaven/WEB-INF/classes donde meterá todos los .class de nuestro compilado.

5.2.- Generación de JavaDoc: Maven permite la generación de un completo JavaDoc ingresando a la raíz del proyecto JAVA, desde consola y escribir:

mvn javadoc:javadoc

Page 11: Tutorial MAVEN

Este se generara dentro de la Carpeta ‘Target/site/apidocs’.

Así se mostrara el JavaDoc ya generado.

5.3.- Generación de Jar, War y Ear:

Maven permite la generación de Jars, Wars y Ears del proyecto Java creado, ingresando a la raíz del proyecto

Jar:Es el tipo de empaquetamiento por defecto y el más común.

mvn jar:jar

War:Es un tipo similar al Jar, Nótese que este plugin requiere un fichero web.xml de configuración de aplicación web.

mvn war:war omvn package

Page 12: Tutorial MAVEN

Ear:Consiste en el despliegue de un fichero descriptor (application.xml), algunos recursos y algunos módulos.El plugin Ear ofrece la posibilidad de ejecutar el objetivo (goal) ear:generate-applicationxml, para generar el descriptor si se desea.

mvn ear:generate-application-xmlmvn ear:ear

De esta manera se mostraría en el Proyecto JAVA.

Page 13: Tutorial MAVEN

5.4.- Generación de .Zip: Maven permite la generación de comprimidos ‘.Zip’, configurables que facilitan la compresión de los Jar, War, Class y todo lo que se desea comprimir.

Se necesita crear un Source Folder en la ruta: src/main/assembly y dentro de el un archivo de configuración: ‘Exporta.xml’

<assembly> <id>bin</id> <formats>

<!-- ******** Formato de comprimidos para la Exportacion ******** --> <!-- <format>tar.gz</format> --> <!-- <format>tar.bz2</format> --> <format>zip</format> </formats> <!-- ******** Archivos que se requiere Comprimir ******** --> <fileSets><!-- Ficheros de configuracion guardados en 'src/main/resources' --> <fileSet> <directory>src/main/resources</directory> <!-- Nombre del Directorio dentro de .Zip --> <outputDirectory>/Recursos</outputDirectory> </fileSet> <!-- Ficheros de configuracion guardados en el 'Target' --> <fileSet> <!-- JARs generados en el 'target', que se incluiran en el directorio Jars dentro del .Zip --> <directory>target</directory> <outputDirectory>/Jars</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <!-- WARs generados en el 'target', que se incluiran en el directorio Wars dentro del .Zip --> <directory>target</directory> <outputDirectory>/Wars</outputDirectory> <includes> <include>*.war</include> </includes> </fileSet> </fileSets>

<!-- Librerias(Jars) de las Dependencias que queremos incluir dentro del .Zip --> <dependencySets> <dependencySet> <!-- Nombre del Directorio dentro de .Zip --> <outputDirectory>/Librerias</outputDirectory> <!-- Para que añada todo lo necesario para la ejecución --> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>

Page 14: Tutorial MAVEN

Así se mostraría en el proyecto Java.

Luego, dentro del archivo Pom.xml, ingresar el plugin para la exportación del ‘.Zip’.

<plugins> <!-- Para la Generacion de '.Zip' --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors><!--Ubicacion del archivo 'Exporta.xml', para la generacion del '.Zip' --> <descriptor>src/main/assembly/Exporta.xml</descriptor> </descriptors> </configuration> </plugin> </plugins>

Para la generación de dicho comprimido, ingresar a la raíz del proyecto JAVA, desde consola y escribir (Previamente tiene que haberse ya generado el Jar y War respectivo):

mvn assembly:assembly

Page 15: Tutorial MAVEN

5.5.- Generación de WebSite: Maven permite la generación de un completo WebSite explicativo en HTML, donde se dan una referencia completo del proyecto Java desarrollado. Ingresar a la raíz del proyecto JAVA, desde consola y escribir:

mvn site

Así se mostraría dentro de la carpeta ‘Target’ en Eclipse.

Page 16: Tutorial MAVEN

Así se mostraría el WebSite generado.

VI.- MANEJO DEL POM.XML.Dentro un fichero Pom.xml, que es un fichero ‘xml’, 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.

Todas las librerías que son descargadas por Maven, las obtiene de su repositorio general, ubicado en:

http://repo1.maven.org/maven2/

Aquí una tabla explicativa de cada propiedad de los Tags utilizado por Maven dentro de su Pom.xml

Elementos Descripciónparent La ubicación del proyecto si existe. Los valores del

proyecto del padre serán predeterminados para este proyecto si ellos no son especificado. La ubicación se da como un group ID, artifact ID y versión.

modelVersion Declara que versión del proyecto se describe en el POM.

groupId El único identificador Universal para el proyecto. Es normal usar un nombre del package para distinguirlo de otros proyectos con un nombre similar (eg.org.apache.maven).

artifactId Es el único identificador para el artefacto dentro del grupo dado por el group ID. Un artefacto es algo que se produce o es usado por un proyecto.

packaging Es el tipo de artefacto que este proyecto produce, por ejemplo Jar, War, Ear, Pom. Los Plugins pueden crear su propio empaquetamiento, para que la lista no contenga todos los posibles tipos.

name El nombre completo del Proyecto.version La versión actual del artifact producido por el

proyecto.description Una descripción detallada del proyecto usada por

Maven.url La URL para homepage del Proyecto.prerequisites Describe los requisitos previos en el ambiente de

construcción del proyecto.issueManagement La información del sistema de administración de

errores del proyecto.ciManagement La información de integración continúa del

proyecto.inceptionYear El año del principio del proyecto, especificado con 4

Page 17: Tutorial MAVEN

dígitos. Este valor se usa cuando se genera los avisos de los derechos de propiedad literaria (copyright).

mailingLists Contiene información sobre listas de email de un proyecto.

developers Describe las personas autorizadas en la modificación del código del software de un proyecto.

contributors Describe a los contribuyentes a un proyecto que no son todavía ‘developers’.

licenses Este elemento describe todas las licencias para este proyecto. Cada licencia se describe por un elemento de la licencia adicional. Los proyectos deben listar sólo licencia(s) aplicadas al proyecto y no las licencias que se aplican a las dependencias.

scm Este elemento describe la especificación para la SCM usado por el proyecto, como CVS, la Subversión, etc.

organization Este elemento describe varios atributos de la organización a la cual el proyecto pertenece. Estos atributos son utilizados cuando la documentación es creada (por copyright, enlaces, etc).

build Información requerida para la construcción del Proyecto.

profiles Una lista de perfiles de proyectos locales que eran modificados en el proceso de construcción, cuando se activen.

modules Los módulos (a veces llamados sub-Proyectos) para que se construyan como una parte del Proyecto. Cada módulo listado es una ruta relativa al directorio que contiene el módulo.

repositories Las listas de los almacenes o repositorios remotos para dependencias y extensiones descubiertas.

pluginRepositories Las listas de los almacenes o repositorios remotos para plugins descubiertos para las figuras e informes.

dependencies Este elemento describe todas las dependencias asociadas con un proyecto. Estas dependencias se usan para construir un classpath para el Proyecto durante el proceso de construcción. Ellos son descargados automáticamente de los repositorios definidos en este proyecto.

reports Deprecated. Ahora ignorado por Maven.reporting Este elemento incluye la especificación de reporte

de plugins para la generación de los reportes en el site de Maven. Estos reportes se correrán cuando un usuario ejecuta el mvn site. Todos los reportes serán incluidos.

dependencyManagement Información de dependencia predefinida para proyectos que heredan de este. Las dependencias en esta sección no son inmediatamente resueltas. En cambio, cuando un POM es derivado de este, se declara una dependencia descrita por un groupId y un artifactId, la versión y otros valores de esta sección son usados por aquella dependencia si no fueron ya especificados.

distributionManagement Información distribuida para un proyecto que permite despliegue del sitio y artefactos para remover servidores Web y repositorios respectivamente.

properties Propiedades que pueden usarse a lo largo del POM como una substitución, y que son usadas como filtros en recursos so si se habilitó. El formato es <name>value </name>.

Dependencias: Son aquellos otros componentes que nuestro software necesita en al-gún momento del ciclo de vida. Una de las grandes novedades de maven2 es que las dependencias no acompañan al código fuente de nuestro desarrollo.

Según el momento en el que se necesite una dependencia tiene distinto ámbito o 'sco-pe', este puede ser: compile, test, provided, run-time, system. Por defecto se entiende que son para compilar. Maven obtiene automáticamente las dependencias del proyecto, bien del repositorio local si ya esta o bien de un repositorio remoto.

Aquí muestro un Pom.xml regularmente completo, con el cual se puede empezar a tra-bajar, donde se muestran algunas propiedades mencionadas en la tabla anterior:

Page 18: Tutorial MAVEN

<?xml version="1.0" encoding="UTF-8"?>

<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.a-pache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>GrupoJavaMaven</groupId> <artifactId>EjemploJavaMaven</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>EjemploJavaMaven</name> <url>http://maven.apache.org</url> <!-- *********************************** --> <!-- **** CONSTRUCCION DEL PROYECTO **** --> <!-- *********************************** --> <build>

<!-- Registrando datos de 'Source Folders' --><finalName>EjemploJavaMaven</finalName><sourceDirectory>src/main/java</sourceDirectory><testSourceDirectory>src/test/java</testSourceDirectory><resources>

<resource><directory>src/main/java</directory><filtering>true</filtering>

</resource><resource>

<directory>src/main/resources</directory><filtering>true</filtering>

</resource></resources>

<plugins><!-- Para que sea construido como Proyecto Web Automáticamente -->

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-eclipse-plugin</artifactId><configuration>

<wtpversion>1.5</wtpversion><buildcommands /><classpathContainers /><projectnatures /><downloadSources>false</downloadSources><downloadJavadocs>false</downloadJavadocs>

</configuration></plugin>

<!-- Para que sea construido como Proyecto Web Automáticamente --><plugin>

<groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration>

<source>1.5</source><target>1.5</target>

</configuration></plugin>

<!-- Para la Generacion de '.Zip' --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration>

Page 19: Tutorial MAVEN

<descriptors><!--Ubicacion del archivo 'Exporta.xml', para la generacion del '.Zip' -->

<descriptor>src/main/assembly/Exporta.xml</descriptor> </descriptors> </configuration> </plugin>

</plugins> </build>

<!-- *********************************** --> <!-- **** REPOSITORIOS DEL PROYECTO **** --> <!-- *********************************** -->

<!-- Permite que corra en 'Jetty', asi los Jars de Tomcat son seran incluidos.--> <repositories>

<repository><releases>

<enabled>false</enabled></releases><snapshots>

<enabled>true</enabled></snapshots><id>apache-maven-snapshots</id><url> http://people.apache.org/repo/m2-snapshot-repository</url>

</repository>

<!-- Ruta del Repositorio donde se descargaran las librerias --> <repository> <id>org.jboss.repository.maven</id> <url>http://repository.jboss.org/maven2</url> <snapshots> <enabled>false</enabled> </snapshots> </repository>

<repository>

<id>atlassian</id><url>http://maven.atlassian.com/repository/

public/</url><releases>

<enabled>true</enabled></releases><snapshots>

<enabled>true</enabled></snapshots>

</repository> <repository> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> <id>apache-maven-snapshots</id> <name>Repository of Snapshots</name> <url>http://people.apache.org/repo/m2-snapshot-repository</url> </repository>

<repository> <id>maven.org.repo2</id> <name>Repository of Maven.org</name> <url>http://repo2.maven.org/</url>

Page 20: Tutorial MAVEN

</repository>

<repository> <id>maven.org.repo1</id> <name>Repository of Maven.org</name> <url>http://repo1.maven.org/maven2</url> </repository>

<repository> <id>apache.snapshots</id> <name>ASF Maven 2 Snapshot</name> <url>http://people.apache.org/builds/struts/2.1.8.1/m2-staging-repository/</url> </repository>

<repository> <id>itextpdf.com</id> <name>Maven Repository for iText</name> <url>http://maven.itextpdf.com/</url> </repository>

<repository> <id>repository.jboss.com</id> <name>Jboss Repository for Maven</name> <url>http://repository.jboss.com/maven2</url> </repository> <repository> <id>snapshots.jboss.org</id> <name>Jboss Snapshot Repository for Maven</name> <url>http://snapshots.jboss.org/maven2</url> </repository> <repository> <id>java.net</id> <name>Repository of Java.net</name> <url>http://download.java.net/maven/1</url> </repository>

<repository> <id>deltaset.org</id> <name>Repository of Deltaset</name> <url>http://deltaset.googlecode.com/svn/maven2</url> </repository>

<repository> <id>prime.com</id> <name>Repository of PrimeFaces</name> <url>http://repository.prime.com.tr/org</url> </repository>

</repositories> <!-- *********************************** --> <!-- **** DEPENDENCIAS DEL PROYECTO **** --> <!-- *********************************** --> <dependencies> <!-- Librerias que seran reconocidas por Maven 'En base a su version respecti-va' -->

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><exclusions>

<exclusion>

Page 21: Tutorial MAVEN

<groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId>

</exclusion></exclusions>

</dependency>

<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>compile</scope>

</dependency> <dependency>

<groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version>

</dependency> </dependencies>

<!-- ************************************* --> <!-- **** ADMINISTRACION DEL PROYECTO **** --> <!-- ************************************* --> <distributionManagement>

<repository><id>xfire</id><name>XFire Central Repository</name><url>dav:https://dav.codehaus.org/repository/xfire/</url>

</repository>

<snapshotRepository><id>xfire-snapshots</id><name>XFire Central Development Repository</name><url>

dav:https://dav.codehaus.org/snapshots.repository/xfire/</url>

</snapshotRepository>

<site><id>xfire-site</id><url>dav:https://dav.codehaus.org/xfire</url>

</site>

</distributionManagement>

</project>

VII.- EXCLUSIONES EN LAS DEPENDENCIAS.

Debido al uso de distintos repositorios de librerías, puede darse el caso que algunas de-pendencias que necesite nuestro proyecto no descarguen. Además, otras dependencias que pese a no ser necesarias para nuestro proyecto si sean necesarias para el correcto funcionamiento de la librería a usar. En estos casos, al no tener control total sobre los re-positorios con los que estamos trabajando, se hace necesaria la utilización de exclusio-nes de dependencias.

Estas exclusiones nos permiten que, según el caso ,nos bajemos todas las dependencias que vienen definidas en el pom.xml de esa librería concreta, o sólo la librería que esta-mos solicitando, de forma que no interfiera con ninguna otra versión de una dependen-cia que tengamos definida en nuestro proyecto.

Page 22: Tutorial MAVEN

Un ejemplo de este tipo de problemas y su resolución puede ser el siguiente caso:

Fichero pom.xml :<?xml version="1.0" encoding="UTF-8"?><project>

<modelVersion>4.0.0</modelVersion>

<groupId>es.juntadeandalucia.cice.test</groupId>

<artifactId>Dependencias</artifactId>

<packaging>war</packaging>

<version>1.0.0</version>

<description></description>

<build>

<finalName>Dependencias</finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.5</source>

<target>1.5</target>

</configuration>

</plugin>

</plugins>

</build>

<dependencies>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-el</artifactId>

<version>1.0</version>

</dependency>

<dependency>

<groupId>org.apache.myfaces.core</groupId>

<artifactId>myfaces-api</artifactId>

<version>1.1.5</version>

</dependency>

</dependencies>

</project>

En este fichero, vemos que tenemos dos dependencias: commons-el y myfaces-api. El problema puede surgir si se incluyen las mismas dependencias pero de versiones distin-tas en ambas.

Page 23: Tutorial MAVEN

Fichero pom.xml de commons-el :<project>

<modelVersion>4.0.0</modelVersion>

<groupId>org.apache.commons</groupId>

<artifactId>commons-el</artifactId>

<name>EL</name>

<version>1.0</version>

<description>JSP 2.0 Expression Language Interpreter Implementation</description>

<dependencies>

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.0.3</version>

</dependency>

</dependencies>

</project>

Hace referencia a la versión 1.0.3 de la librería commons-logging, si en la librería my-faces-api se hace referencia a esta librería también:

Fichero pom.xml de myfaces-api :

<project>

<modelVersion>4.0.0</modelVersion>

<groupId>org.apache.myfaces.core</groupId>

<artifactId>myfaces-api</artifactId>

<name>myfaces-api</name>

<version>1.1.5</version>

<dependencies>

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.0.4</version>

</dependency>

</dependencies>

</project>

Como resultado de esto, en el .War generado para nuestro proyecto, estarían dos libre-rías commons-logging de versiones distintas: 1.0.3 y 1.0.4 debido a las dependencias transitivas de nuestro proyecto. Para evitar los problemas derivados de este tipo de de-pendencias, se utilizan las exclusiones dentro de cada dependencia concreta. Una for-ma de solucionar el problema puede ser la siguiente:<?xml version="1.0" encoding="UTF-8"?><project>

Page 24: Tutorial MAVEN

<modelVersion>4.0.0</modelVersion>

<groupId>es.juntadeandalucia.cice.test</groupId>

<artifactId>Dependencias</artifactId>

<packaging>war</packaging>

<version>1.0.0</version>

<description></description>

<build>

<finalName>Dependencias</finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.5</source>

<target>1.5</target>

</configuration>

</plugin>

</plugins>

</build>

<dependencies>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-el</artifactId>

<version>1.0</version>

<exclusions>

<exclusion>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.apache.myfaces.core</groupId>

<artifactId>myfaces-api</artifactId>

<version>1.1.5</version>

</dependency>

</dependencies>

</project>

Page 25: Tutorial MAVEN

Al hacer esto, evitamos que al descargar el proyecto la dependencia commons-el se descargue también el commons-logging, dejando el proyecto con el commons-lo-gging de myfaces-api (versión 1.0.4).

VIII.- PROYECTO MULTIMÓDULO.

Si nuestro proyecto es realmente un conjunto de varios módulos o proyectos indepen-dientes, como puede ser una aplicación Enterprise con un modulo de Persistencia, uno de Negocio y otra Vista y queremos construirlos todos a la vez, con la siguiente es-tructura:

+- pom.xml+- capa-Vista

| +- pom.xml+- capa-Negocio

| +- pom.xml+- capa-Persistencia

| +- pom.xml

Como se puede ver en el árbol anterior, la idea es tener un pom.xml en lo que sería la carpeta del proyecto global.

<project xmlns="http://maven.apache.org/POM/4.0.0".......<packaging>pom</packaging> <modules> <module>capa-Persistencia</module> <module>capa-Negocio</module> <module>capa-Vista</module> </modules></project>

A continuación añadiremos a cada pom.xml de los subMódulos, la dependencia con los otros y la referencia al pom.xml global. Por ejemplo en el pom.xml de la capa-Vista. <parent> <groupId>es.juntadeandalucia.ejemplos</groupId> <artifactId>capa-Vista</artifactId> <version>1.0</version> </parent> <dependency> <groupId>com.mycompany.app</groupId> <artifactId>capa-Negocio</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.mycompany.app</groupId> <artifactId>capa-Persistencia</artifactId> <version>1.0</version> </dependency>

Page 26: Tutorial MAVEN

VIII.- CICLO DE VIDA.

Pasamos a describir cuales son las fases Maven de un proyecto:

validate: esta es la fase en la que valida que el proyecto este correcto y tenga toda la información necesaria para su construcción.

generate-sources: genera codigo fuente para incluirla en la compilación.

process-sources: Procesa el código fuente. Por ejemplo para el filtrado de valo-res.

generate-resources: Genera los refuerzos para inclusión en el paquete.

process-resources: Copia y procesa los recursos dentro de la carpeta de des-tino, preparados para empaquetarse.

compile: es la fase en la que se compila el código fuente del proyecto.

process-classes: Post procesa los ficheros generados de la compilación para por ejemplo hacer optimización de los byteCode en clases Java.

generate-test-sources: genera código fuente para la inclusión en la compila-ción.

process-test-sources: Procesa el código fuente de los test por ejemplo para el filtrado de valores.

generate-test-resources: Genera los recursos para pruebas.

process-test-resources: Copia y procesa los recursos dentro de la carpeta de destino.

test-compile: Compila el código fuente de los test.

test: fase en la que se ejecutan los test de la aplicación. Estos test no necesitan que la aplicación este empaquetada ni desplegada.

package: es la fase en la que se toman las clases compiladas y recursos y se crea un paquete con el proyecto (Jar, War, Ear).

integration-test: fase en la que se ejecutan los test de integración. Aquí se pro-cesa y despliega el paquete si es necesario para que corran * * las pruebas de in -tegración.

verfy: fase en la que se realiza algún tipo de chequeo para comprobar si el pa-quete cumple con las normas de calidad.

install: fase en la que se instala el paquete en el repositorio local para ser usado como dependencia por otros proyectos locales.

deploy: en esta fase se copia el paquete a un repositorio remoto para ser com-partido con otros usuarios y proyectos.

Otro ciclo de vida estándar es el de limpieza (clean), con las siguientes fases: pre-clean

clean

post-clean

Y otro es el de creación del sitio (site) de documentación e informes sobre el proyecto:

Page 27: Tutorial MAVEN

pre-site

site - genera el sitio y los reports

post-site

site-deploy - despliega el sitio en un servidor remoto

IX.- INSTALACION DEL PLUGIN DE MAVEN PARA ECLIPSE.

Para instalar el plugin de maven2 para eclipse.

9.1.- En el menú "Help", "Software updates", "Find and install..."

9.2.- En la ventana que sale seleccionamos "Search for new features to install..." y pul-samos "next"

9.3.- En la nueva ventana pulsamos "new remote site".

9.4.- En la ventana que sale ponemos un nombre cualquiera ( por ejemplo "Maven2" ) y ponemos una de las siguientes direcciones dependiendo del plugin a instalar :

http://m2eclipse.codehaus.org/

http://q4e.googlecode.com/svn/trunk/updatesite/

9.5.- Pulsamos "ok"

9.6.- En las siguientes ventanas, vamos marcando los checks que aparecen, que es lo que queremos instalar y aceptamos

9.7.- Reiniciamos eclipse cuando nos lo preguntan.

Aquí les dejo 2 link de videos donde se muestran todo lo anteriormente explicado.

http://m2eclipse.codehaus.org/ Installing_Maven_2.0_plugin_for_Eclipse.html

http://m2eclipse.codehaus.org/Maven_2.0_Plugin_for_Eclipse.html

X.- REPOSITORIOS DE MAVEN IMPORTANTES: http://search.maven.org/

<repositories>

<repository><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots><id>apache-maven-snapshots</id><name>Repository of Snapshots</name><url>http://people.apache.org/repo/m2-snapshot-repository</url>

</repository>

<repository> <id>maven.org</id> <name>Repository of Maven.org</name> <url>http://repo1.maven.org/maven2</url>

Page 28: Tutorial MAVEN

<layout>default</layout> </repository>

<repository> <id>repository.jboss.com</id> <name>Jboss Repository for Maven</name> <url>http://repository.jboss.com/maven2</url> <layout>default</layout> </repository> <repository> <id>snapshots.jboss.org</id> <name>Jboss Snapshot Repository for Maven</name> <url>http://snapshots.jboss.org/maven2</url> <layout>default</layout> </repository> <repository> <id>java.net</id> <name>Repository of Java.net</name> <url>http://download.java.net/maven/1</url> <layout>legacy</layout> </repository> <repository> <id>deltaset.org</id> <name>Repository of Deltaset</name> <url>http://deltaset.googlecode.com/svn/maven2</url> <layout>default</layout> </repository>

<repository> <id>prime.com</id> <name>Repository of PrimeFaces</name> <url>http://repository.prime.com.tr/org</url> <layout>default</layout> </repository>

</repositories>

XI.- DEFINICIONES RÀPIDAS E IMPORTANTES DE MAVEN.

A.- Verificar la Versión del Maven. mvn –version

B.- Muestra un wizard de ayuda. (No presente en todas las versiones del Maven)

mvn archetype:generate

C.- Limpia configuración Maven mvn clean

D.- Genera el paquete (Jar, War, Ear, etc) que hayamos indicado en el pom.xml, compilaria los fuentes de la aplicación, los test unitarios y los ejecutaría.mvn package

E.- Compila el Proyecto Maven mvn compile

F.- Ejecuta y construye un Proyecto con Maven (Descarga Librerías si es necesario)

mvn install

Page 29: Tutorial MAVEN

G.- Ejecuta y construye un Proyecto con Maven (Descarga Librerías si es necesario), sin hacer Test mvn install -Dmaven.test.skip=true

H.- Limpia un proyecto con configuración para Eclipse mvn eclipse:clean

I.- Modifica un proyecto para que sea reconocido por Eclipse (Brinda una estructura)

mvn eclipse:eclipseJ.- Fuerza a la descarga de las librerías de Internet. mvn eclipse:eclipse -DdownloadSources

K.- Modifica un proyecto a tipo Web, para que sea reconocido por Eclipse (Brindauna estructura)

mvn -Dwtpversion=1.5 eclipse:eclipse

M.- Limpia, Compila y Ejecuta el Maven sin hacer Test mvn clean compile install -Dmaven.test.skip=true

N.- Genera JavaDoc mvn javadoc:javadoc

Ñ.- Genera WebSite mvn site

O.- Genera Jar File. mvn jar:jar

P.- Genera War File. mvn war:war

Q.- Genera el ’application-xml’, que es base para generar el Ear War File.mvn ear:generate-application-xml

R.- Genera Ear War File.mvn ear:ear

S.- Genera Zip File. mvn assembly:assembly

T.- SNAPSHOT:Una versión Snapshot es una versión de un Jar que todavía está en desarrollo, por lo que cambia con frecuencia. En la versión se suele poner algo como fichero-1.0-SNAPSHOT.jar .Maven interpreta ese trozo "SNAPSHOT" como algo que está en desarrollo.

XII.- HERRAMIENTAS RELACIONADAS CON MAVEN.

Continuum: Es un servidor de integración continua para proyectos basados en Java. Soporta proyectos en Maven 2, Maven 1, Ant, Shell scripts. La integración continua es una metodología informática propuesta inicialmente por Martin Fow-ler que consiste en hacer integraciones automáticas de un proyecto lo más a me-nudo posible para así poder detectar fallos cuanto antes. Entendemos por inte-gración la compilación y ejecución de tests de todo un proyecto.

Maven Proxy: Es un motor ligero de servlets que se instala en tu servidor e imita otros repositorios como ibiblio por ejemplo. Cuando recibe una petición de un jar y no lo tiene, lo consigue de los servidores y lo almacena en cache antes de de-volver la petición. No tiene administración, ni navegador visual.

Archiva: Esta herramienta permite la publicación y gestión de un repositorio de dependencias para maven2 remoto. Algunas de sus funcionalidades son: búsque-

Page 30: Tutorial MAVEN

da de información en los pom.xml y ficheros, creación y gestión un repositorio, proxy, mantenimiento y reporting.

Artifactory : Ofrece funcionalidades de proxy, cache y seguridad muy avanzas y tiene funciones de backup y de búsqueda de librerías. Artifactory utiliza un JSR - 170 compatible con Java Content Repository (JCR) para el almacenamiento, lo que hace fácil de manejar los metadatos totalmente indexados y buscables para pro-porcionar características extendidas como la seguridad, las operaciones transac-cionales, la realización de auditorías, bloqueo, etc.

XIII.- ENLACES RELACIONADOS DE MAVEN:http://repo1.maven.org/maven2http://people.apache.org/repo/m2-snapshot-repositoryhttp://repository.jboss.com/maven2http://snapshots.jboss.org/maven2http://download.java.net/maven/1http://deltaset.googlecode.com/svn/maven2http://repository.prime.com.tr/orghttp://docs.codehaus.org/display/MAVENUSER/Archetypes+Listhttp://www.chuidiang.com/chuwiki/index.php?title=Integraci%C3%B3n_de_Maven_y_Eclipsehttp://www.chuidiang.com/java/herramientas/maven.phphttp://www.chuidiang.com/chuwiki/index.php?title=Hacer_un_zip_para_distribuirhttp://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Mavenhttp://odrarg.blogspot.com/2008/03/crear-proyecto-web-con-maven-y-eclipse.htmlhttp://q4e.googlecode.com/svn/trunk/updatesitehttp://maven.apache.org/ref/2.0.8/maven-model/maven.htmlhttp://www.juntadeandalucia.es/xwiki/bin/view/MADEJA/Maven2http://www.elholgazan.com/2007/08/ciclo-de-vida-por-defecto-en-maven.htmlhttp://archiva.apache.org/http://tecnologiasjava.blogspot.com/2008/09/helloservlet-web-application-con-maven2.html