La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Introducción a Maven 2.0 TELEFÓNICA I+D Carlos Gómez Fecha: 25/03/2009

Presentaciones similares


Presentación del tema: "Introducción a Maven 2.0 TELEFÓNICA I+D Carlos Gómez Fecha: 25/03/2009"— Transcripción de la presentación:

1 Introducción a Maven 2.0 TELEFÓNICA I+D Carlos Gómez Fecha: 25/03/2009
© 2007 Telefónica Investigación y Desarrollo, S.A. Unipersonal

2 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

3 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

4 01 ¿Qué es maven? Herramienta para gestión y construcción proyectos java Lo que teníamos hasta ahora era: Ant Makefiles IDE Shell/Perl Scripts

5 Aplicar patrones para la construcción de proyectos
01 Aplicar patrones para la construcción de proyectos Builds Documentación Informes Dependencias Integración con repositorios Generación de releases Distribución Web del proyecto

6 01 ¿Qué nos proporciona? Un modelo estándar para gestionar y describir proyectos Encapsula mejores prácticas Bajo coste de configuración y mantenimiento Fácil integración de nuevas herramientas Tras la instalación, dispondremos de funcionalidades que nos facilitarán tareas a distintos niveles Inicialización de proyectos, integración con IDEs, configuración de proyectos (JDKs, dependencias, ...) Procedimientos por defecto para la realización de las tareas base Compilación, pruebas unitarias, empaquetado,... Simplifica y unifica los procesos de distribución, mantenimiento de la documentación, instalación, ...

7 01 ¿Qué nos proporciona? Estructuras comprensibles que eviten cosas como...

8 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

9 Conceptos maven Estructura de directorios
02 Conceptos maven Estructura de directorios Estructura de directorios predefinida Estandarización Fácil comprensión Facilita las operaciones con los Sistemas de Control de Versiones, de Gestión de Requisitos, …

10 Conceptos maven Ciclos de vida
02 Conceptos maven Ciclos de vida Tres ciclos Inicialización Construcción Documentación

11 Conceptos maven Ciclo de vida asociado al proceso de construcción
02 Conceptos maven Ciclo de vida asociado al proceso de construcción Este proceso de construcción permite a los desarrolladores ir cambiando de proyectos, sin necesidad de tener que aprender nuevos procesos validate process-class package initialize generate-test-sources pre-integration-test generate-sources process-test-sources integration-test process-sources generate-test-sources post-integration-test generate-resources process-test-resources verify process-resources compile-test install compile test deploy

12 Conceptos maven Ciclo de vida asociado a la inicialización
02 Conceptos maven Ciclo de vida asociado a la inicialización pre-clean clean post-clean

13 Conceptos maven Ciclo de vida asociado a la documentación
02 Conceptos maven Ciclo de vida asociado a la documentación pre-site site post-site deploy-site

14 02 Conceptos Maven POM pom.xml (Project Object Model)
Unidad de trabajo fundamental en Maven Describe la configuración del proyecto Nombre y descripción Dependencias de otros otros proyectos Requisitos de la construcción Información Empresa y desarrolladores Licencias Documentación del proyecto

15 Conceptos maven Árbol POM
02 Conceptos maven Árbol POM

16 Conceptos Maven POM mínimo
02 Conceptos Maven POM mínimo Lo único necesario para invocar a Maven para construir un JAR, WAR, etc. Si se está utilizando la estructura de ficheros fuentes por defecto <?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 <modelVersion>4.0.0</modelVersion> <groupId>es.tid.ad.seminar</groupId> <artifactId>ms</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Seminario de spring y maven</name> <packaging>jar</packaging> <!-- optional for JAR --> </project>

17 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

18 Construcción de un proyecto Creación proyecto
03 Construcción de un proyecto Creación proyecto Creación de un proyecto a partir de un arquetipo genérico Estructura inicial: mvn archetype:generate -DgroupId=com.mycompany.app-DartifactId=app -Dversion=0.0.1-SNAPSHOT –DinteractiveMode=false

19 Construcción de un proyecto Compilación
03 Construcción de un proyecto Compilación Compilación del proyecto Resultado compilación: mvn compile

20 Construcción de un proyecto Ejecución de test
03 Construcción de un proyecto Ejecución de test Ejecución de test Resultado test: mvn test

21 Construcción de un proyecto Empaquetado
03 Construcción de un proyecto Empaquetado Ejecución del empaquetado Resultado: mvn package

22 Construcción de un proyecto Instalación en el repositorio local
03 Construcción de un proyecto Instalación en el repositorio local Ejecución de la instalación en un repositorio local Resultado instalación: mvn install

23 Construyendo un proyecto Resumen construcción
03 Construyendo un proyecto Resumen construcción El resultado del proyecto es un artifact (componente) Los goals (objetivos) más comunes para la construcción son: compile – Compila el código test – Testea el código package – Empaqueta el componente (jar,war,ear, …) install – Instala el componente en el repositorio local deploy – Instala el componente en el repositorio remoto eclipse:eclipse – Adapta el componente a eclipse Ej: Incialización empaquetado de un componente deployinstallpackagetestcompile mvn clean package

24 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

25 03 Repositorios Los artifacts(componente/proyecto) son almacenados en:
Repositorio Local: Funciona a modo de caché de todos los artifacts utilizados en los proyectos que hay instalados en la máquina (Por defecto en: $HOME/.m2/repository para linux o C:\Documents and Settings\<user>\.m2\repository para windows) Repositorio remoto: Accesible a través de http, https o scp al almacén de componentes El repositorio Central de Maven contiene los artifacts más comunes (unos 50000)

26 03 Repositorios Configuración de repositorios(I) pom.xml
<distributionManagement> <!– Repositorio de componentes estables--> <repository> <id>repos-release</id> <name>Repositorio de componentes de TID</name> <url>http://reposbcn.hi.inet:8081/nexus/content/repositories/tidRelease/</url> </repository> <!– Repositorio de componentes inestables--> <snapshotRepository> <id>repo-snapshot</id> <name>Repositorio de snapshots componentes</name> <url>http://reposbcn.hi.inet:8081/nexus/content/repositories/tidSnapshot/ </url> </snapshotRepository> ...

27 03 Repositorios Configuración de repositorios (II) pom.xml …
<!– Repositorio de documentación del proyecto --> <site> <id>reposbcn-site</id> <url> scp://reposbcn.hi.inet/home/maven/MAVEN/site/${project.groupId} /${artufactId} </url> </site> </distributionManagement> En están definidos todos los repositorios en los que se entregan los diferentes componentes

28 03 Repositorios Configuración de repositorios(III)
$MAVEN_HOME/conf/settingxs.xml <server> <id>repo-release</id> <username>admin</username> <password>admin123</password> </server <id>repo-snapshot</id> </server> <id>repo-site</id> <username>maven</username> <password>ihateant</password> En está disponible la configuración completa de maven

29 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

30 Añadiendo dependencias (I)
03 Añadiendo dependencias (I) Se declaran las dependencias y automáticamente son añadidas al classpath e incluidas en la distribución resultante del componente. Cada dependencia se ha de incluir dentro de un scope compile: Son necesarias para compilar el proyecto (Se incluyen en el classpath de compilación) runtime: Son necesarias únicamente para ejecutar el proyecto (Se incluyen en el classpath de ejecución). Ej: La librería commons-logging nos abstrae de la librería de trazas que se utilice a la hora de ejecutar el proyecto. Por eso la librería commons-logging se ha de añadir al scope de compile, mientras que la de log4j, sólo es necesario en el scope de runtime test: Son necesarias para ejecutar los tests del proyecto (El classpath de ejecución de los test está formado por las dependencias en el scope de compile, runtime y test). provided: Son necesarias para la compilación del proyecto, pero no se han de entregar en el paquete. Ej: La librería servlet-api es necesaria para compilar servlets, pero esta librería ya la incluyen los servidores de aplicaciones (En tomcat  $TOMCAT_HOME/lib/servlet-api.jar) y no hay que incluirla en el WAR. system: Esta dependencia está instalada en la misma máquina, y por tanto se apunta a la ruta donde está instalada. El efecto es el mismo que el scope de compile.

31 Añadiendo dependencias (I)
03 Añadiendo dependencias (I) Ejemplo: <dependencies> <dependency> <groupId> commons-logging </groupId> <artifactId> commons-logging-api </artifactId> <version>1.1.1</version> <scope>compile</scope> </dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <scope>runtime</scope> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet.api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependencies>

32 Añadiendo dependencias (II)
03 Añadiendo dependencias (II) Maven soporta dependencias transitivas, es decir, que cuando se inserta una dependencia, si esta depende de otras, estas otras se añaden al classpath. Si no son necesarias, hay que excluirlas: <dependencies> <dependency> <groupId>commons-logging </groupId> <artifactId>commons-logging-api</artifactId> <version>1.1.1</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> <groupId>logkit</groupId> <artifactId>logkit</artifactId> <groupId>avalon-framework</groupId> <artifactId>avalon-framework</artifactId> </exclusions> </dependency>

33 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

34 03 Plugins Se encargan de personalizar el proceso de construcción de un proyecto maven. Se configuran en la sección de build ( y en la de site para generación de la Web del proyecto) <build> <plugins> <!-- modificar las opciones del compilador --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> <encoding>utf-8</encoding> <debug>false</debug> <optimize>true</optimize> </configuration> </plugin> </plugins> </build>

35 03 Plugins Ej 2: Definición del empaquetado de un proyecto
<!-- Definición del empaquetado del proyecto --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <!-- CONFIGURACIÓN PARAMETROS --> <configuration> <filters> <filter>src/main/filters/${env}.properties</filter> <!-- Para un entorno en concreto --> </filters> <descriptors> <descriptor>src/main/assembly/dep.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>install</phase> <!-- FASE EN LA QUE SE EJECUTA ESTE PLUGIN. --> <goals> <goal>single</goal> <!– METODO DEL PLUGIN QUE SE EJECUTARÁ LA FASE DE INSTALL --> <!-- Ver --> </goals> </execution> </executions> </plugin>

36 Plugins Plugins estándar de maven
03 Plugins Plugins estándar de maven Core Clean Compiler Deploy Install Resources Site Surefire Verifier Integration Eclipse Idea Packaging Ear Ejb Jar Rar War Reporting Changelog Changes Checkstyle Clover Javadocs PMD Surefire-reports Tools Ant Archetype Assembly Dependency Help Release SCM ... Others cargo Jetty

37 Plugins Invocación plugins
03 Plugins Invocación plugins Dos formas: Ejemplos: mvn site:site (Genera la documentación del proyecto) mvn site:deploy (Copia la documentación del proyecto en un repositorio remoto) mvn scm:checkout (Hace un checkout del proyecto) mvn plugin:goal mvn pluginGroupId:pluginArtifactId:pluginVersion:goal

38 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

39 03 Control de versiones Maven permite integrarse con la mayoría de sistemas de control de versiones: (CVS, SVN, …). Para ello: Configurar POM para acceder al repositorio Configurar POM para realizar release del proyecto

40 Control de versiones Acceso al repositorio
03 Control de versiones Acceso al repositorio Configuración en el POM <scm> <url>http://reposbcn.hi.inet/repositorio/publicidad/carlosg/trunk/cxf</url> <!-- Acceso modo lectura anónimo -->   <connection> scm:svn:http://reposbcn.hi.inet/repositorio/publicidad/carlosg/trunk/cxf </connection> <!-- Acceso modo lectura/escritura NO anónimo -->   <developerConnection> scm:svn:https://reposbcn.hi.inet/repositorio/publicidad/carlosg/trunk/cxf </developerConnection>  </scm>

41 mvn scm:checkout / mvn scm:checking
03 Control de versiones Acceso al repositorio. Configuración maven-scm-plugin POM para hacer checkout, checkin, update, … (http://maven.apache.org/scm/plugins/) <build> <plugins> <!-- integración con SVN  --> <plugin>   <groupId>org.apache.maven.plugins</groupId>   <artifactId>maven-scm-plugin</artifactId>   <version>1.0</version> <configuration>   <goals>install</goals> <!-- Se descarga el proyecto, lo compila, pasa los tests, lo empaqueta y lo instala en el repositorio local -->   <checkoutDirectory>/home/cm/CM/dev/eclipse/workspace</checkoutDirectory>   <username>carlosg</username>   <password>mipassword</password>   <tagBase> scm:svn:https://reposbcn.hi.inet/repositorio/commovistar/tags </tagBase>   </configuration>   </plugin> </plugins> </build> mvn scm:checkout / mvn scm:checking

42 03 Control de versiones Generación release. Configuración maven-release-plugin POM para hacer release (http://maven.apache.org/plugins/maven-release-plugin/) <build> <plugins> <!-- integración con SVN  --> <plugin>   <groupId>org.apache.maven.plugins</groupId>   <artifactId>maven-release-plugin</artifactId>   <version>1.0</version> <configuration>   <username>carlosg</username>   <password>mipassword</password>   <tagBase>https://reposbcn.hi.inet/repositorio/publicidad/carlosg/tags </tagBase>   </configuration>   </plugin> </plugins> </build> mvn release:prepare  Compila, pasa los test y genera tag en el repositorio mvn release:perform  Se descarga el contenido del tag generado, compila, pasa test, genera el “.jar” con la versión y lo entrega en el repositorio y genera la documentación

43 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

44 03 Arquetipos Para empezar un proyecto se puede elegir un patrón de proyecto o arquetipo. Un arquetipo es un proyecto MAVEN, con su propio pom.xml En el fichero archetype.xml se definen los diferentes ficheros que forman la plantilla Se crea a partir de mvn archetype:generate Ej: Arquetipo para crear una aplicación JSF mvn archetype:generate -DgroupId=es.tid.icm.cm -DartifactId=jsf-app-sample -DarchetypeArtifactId=maven-archetype-jsfapp -DarchetypeGroupId=es.tid.formacion -DarchetypeVersion=1.0-SNAPSHOT -DremoteRepositories=http://ironman.hi.inet:7777/maven

45 Arquetipos Estructura de un archetipo
03 Arquetipos Estructura de un archetipo

46 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Ej: Arquetipo para crear una aplicación JSF Creando el proyecto con el arquetipo mvn archetype:generate -DgroupId=es.tid.icm.cm -DartifactId=jsf-app-sample -DarchetypeArtifactId=maven-archetype-jsfapp -DarchetypeGroupId=es.tid.formacion -DarchetypeVersion=0.0.1-SNAPSHOT -DremoteRepositories=http://ironman.hi.inet:7777/maven –DinteractiveMode=false

47 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Proyecto creado

48 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Adaptación del proyecto a eclipse

49 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Proyecto adaptado a eclipse

50 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Insertando proyecto en eclipse

51 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Insertando proyecto en eclipse (II)

52 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Insertando proyecto en eclipse (III)

53 Arquetipos Ejemplo: Construcción de un proyecto JSF
03 Arquetipos Ejemplo: Construcción de un proyecto JSF Insertando proyecto en eclipse (IV)

54 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

55 Perfiles de construcción
03 Perfiles de construcción Modifica la construcción del proyecto dependiendo del entorno: Dependencias, repositorios y plugins El perfil puede ser seleccionado por: El sistema operativo, JDK, la existencia de algún software, o bien a través de la línea de comandos. Por usuario o por proyecto Y puede ser usado para entornos estándar Desarrollo, Integración y Producción

56 Perfiles de construcción
03 Perfiles de construcción Ejemplo: Configuración de los repositorios (Se incluyen en el pom.xml, settings.xml ó en profiles.xml) <profiles> <!-- Profile desarrollo (Activo por defecto) --> <profile> <id>development</id> <activation><activeByDefault>true</activeByDefault> </activation> <properties> <env>development</env> <compiler.info.debug>true</compiler.info.debug> <compiler.optimize>false</compiler.optimize> </properties> </profile> <!-- Producción --> <id>production</id> <activation> <activeByDefault>false</activeByDefault> </activation> <env>production</env> <compiler.info.debug>false</compiler.info.debug> <compiler.optimize>true</compiler.optimize> <!-- Integration --> …

57 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

58 03 Site y Documentación Maven ayuda a la generación de la web del proyecto, añadiendo información del componente de forma “automática”, a partir de la descripción del mismo en el pom.xml Acepta diferentes formatos de entrada de texto APT (Almost Plain Text) Xdoc FML (Faq Markup Language) DocBook Permite la salida en Xdoc, XHTML, DocBook, Latex y RTF La generación del site permite la utilización de plantillas de velocity.

59 Ejemplo de documento APT
03 Ejemplo de documento APT

60 Ejemplo de documento APT
03 Ejemplo de documento APT

61 Generando la documentación del proyecto
03 Generando la documentación del proyecto Creando el site (mvn site:site)

62 Generando la documentación del proyecto
03 Generando la documentación del proyecto Resultado de la generación

63 Generando la documentación del proyecto
03 Generando la documentación del proyecto Desplegando el site (mvn site:deploy)

64 Generando la documentación del proyecto
03 Generando la documentación del proyecto Accediendo a la web del proyecto (I)

65 Generando la documentación del proyecto
03 Generando la documentación del proyecto Accediendo a la web del proyecto (II)

66 Generando la documentación del proyecto
03 Generando la documentación del proyecto POLÉMICA APT/WIKI Ventajas wiki: Edición muy sencilla y con posiblidadades de previsualización No es necesario compilar la documentación Ventjas APT: Generación automática de informes Toda la documentación asociada al proyecto

67 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

68 04 MAVEN en TID Objetivo: Trabajo colaborativo
Utilizar un repositorio de componentes común para compartir todos los componentes Trabajo colaborativo No se trata de que alguien se dedique a hacer componentes para el resto de divisiones o proyectos. Sino que cada uno compartiese volutariamente sus componentes. Para conseguirlo habría que definir una guía de buenas prácticas donde se recogiesen, ¿cuáles son los requisitos para compartir un componente? Documentación del componente Jerarquía de paquetes ...

69 MAVEN en TID Repositorios “oficiales” de TID
04 MAVEN en TID Repositorios “oficiales” de TID En existe un proxy de repositorios. Repositorios internos (acceso modo lectura/escritura) Repositorios externos (Consultaros en Repositorio documentación

70 03 Construcción de un proyecto
Índice 01 Introducción 02 Conceptos maven 03 Construcción de un proyecto - Creación proyecto Control de versiones - Repositorios - Arquetipos - Dependencias - Perfiles - Plugins - Site y documentación 04 Maven en TID 05 Conclusiones

71 Conclusiones ¿Cómo encaja maven dentro de un proyecto?
05 Conclusiones ¿Cómo encaja maven dentro de un proyecto? Definiendo y manteniendo proyectos de forma estandarizada Generando informes de los que obtener indicadores para la toma de decisiones Agilizando los procesos de distribución Centralizando la información mediante la generación de un sitio web para los proyectos Integrándose con repositorios de fuentes, sistemas de integración contínua…

72 05 Conclusiones No dedicar más tiempo del necesario a definir procedimientos si herramientas como Maven ya los modelan. Maven como resultado de la experiencia de otros profesionales. Existe gran cantidad de plugins que nos permiten trabajar con framework y librerías más conocidas: hibernate, struts, Spring, ... (Cuidadiiiiiiiin!! con los plugins que algunos no están estables, y la mayoría poco documentados). Permite el trabajo colaborativo La generación automatizada de código fuente, archivos de configuración, documentación, etc..., aumenta la productividad y reduce el riesgo de errores.

73 Dudas, preguntas, …

74 Bibliografía Web oficial de maven
Documentación de maven en reposbcn (Esta presentación) Better Builds with maven

75


Descargar ppt "Introducción a Maven 2.0 TELEFÓNICA I+D Carlos Gómez Fecha: 25/03/2009"

Presentaciones similares


Anuncios Google