Saltar a contenido

35. MAVEN

https://www.tutorialspoint.com/maven/maven_overview.htm
Introducción a maven y Tutorial maven en eclipse

35.1 Empezamos

Maven es una herramienta para la getionar, construir proyectos, librerías, pruebas ...

Características del sistema Maven.

  • Build. Compilar, enlazar el código del proyecto
  • Testing. Ejecuatar las pruebas
  • Dependencias. Gestiona las dependencias y obtiene las liberías adecuadas al proyecto
  • Despliegue de artefactos en los servidores
  • Descarga de arquetipos , plantillas para cada tipo de proyecto
  • Crear y desplegar web, incluida la documentación.
  • Se integra con otras herramientas como JIRA, GIT.

Ejemplo de ciclo de producción de una aplicación:

  1. Compilación y validación del código
  2. Pruebas unitarias.
  3. Empaquetar el proyecto en WAR O JAR
  4. Desplegar los ficheros
  5. Pruebas de integración en el servidor de pruebas
  6. Subir proyecto al servidor de producción.
  7. Desplegar los servicios y puesta en producción

ciclo

maven dispone de un interaz de comandos y está integrado en Eclipse. El uso de uno o de otro es equivalente.

35.2 Términos usados por Maven

artefacto es el termino maven para proyecto

35.3 Mapas conceptuales para Maven

35.3.1 Conceptos Maven

graph TD A[Maven] -->|gestiona| B[Ciclo de vida] A -->|utiliza| C[POM.xml] A -->|accede a| D[Repositorios] A -->|emplea| E[Plugins] A -->|resuelve| F[Dependencias] B -->|incluye| G1[clean] B -->|incluye| G2[validate] B -->|incluye| G3[compile] B -->|incluye| G4[test] B -->|incluye| G5[package] B -->|incluye| G6[install] B -->|incluye| G7[deploy] C -->|define| H1[GAV] C -->|define| H2[Properties] D -->|tipos| I1[Local] D -->|tipos| I2[Central] D -->|tipos| I3[Remote] E -->|ejemplos| J1[Compiler] E -->|ejemplos| J2[Surefire] E -->|ejemplos| J3[Archetype] F -->|tipos| K1[Jar] F -->|tipos| K2[War] F -->|tipos| K3[Pom]

35.3.2 Fichero pom

graph TD; POM -->|contiene| ProjectInfo; POM -->|define| Dependencies; POM -->|especifica| Repositories; POM -->|configura| Plugins; POM -->|establece| Properties; POM -->|controla| Build; ProjectInfo -->|incluye| groupId; ProjectInfo -->|incluye| artifactId; ProjectInfo -->|incluye| version; ProjectInfo -->|incluye| name; ProjectInfo -->|incluye| description; Dependencies -->|lista| dependency; Repositories -->|lista| repository; Plugins -->|lista| plugin; Properties -->|lista| property; Build -->|incluye| finalName; Build -->|incluye| resources; Build -->|incluye| plugins;

35.4 Maven en Eclipse

35.4.1 Instalación

Eclipse incluye maven en muchas de sus distribuciones.

35.5 Crear Proyecto con Maven

Previamene tenemos que asegurarnos que está marcada la opción:

preferencias- > maven -> Download repository index

Usando el menu de Eclipse new->project->maven

35.6 Repositorio y dependencias

Los "artifact" se almacenan en repositorios en servidores públicos web.
A dia de hoy la lista de repositorios tiene 1468 entradas.
El principal es maven central. Las busquedas en mvnrepository incluyen los resultados en varios de estos servidores ( central , Atlassian, etc).

35.7 Fichero POM

Cada vez que se cambia pom.xml debemos actualizar el proyecto:
Sobre el proyecto botón derecho -> Maven -> update project.
Se descargan librerias (jar) etc. Veamos las diferentes partes de este fichero

35.7.1 Etiqueta project

Engloba todo el proyecto. En los atributos se incluye el ambito de nombrado y el schema

35.7.2 Model version

 <modelVersion>4.0.0</modelVersion>
 ```

 ### Identificador del proyecto

 ```xml

  <groupId>edu.dam1</groupId>
  <artifactId>Calculadora</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  ```
 **packaging** indica al sistema de construcción de maven, que queremos como resultado. En este ejemplo un fichero **jar**  

 ```xml
 <name>Calculadora</name>
  <url>http://maven.apache.org</url>
y puede incluir:
<description>: una descripción sobre el proyecto, o de lo que queramos.
<organization>: el nombre de la empresa.
<developers>: los desarrolladores implicados.
<contributors>: los contribuidores que nos ayudaron.
<inceptionYear>: el año en que empezamos con el proyecto.
<licenses>: las licencias.

35.7.3 Etiqueta properties

Se pueden considerar variables globales para todo el pom. El arquetipo suele incluir

 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
ejemplo:
 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
scope indica a maven donde usamos las librerías

Los posibles valores de <scope> son (no te entretengas mucho leyéndolos, a medida que los necesites los vas a ir usando, los pongo aquí por comodidad):

  • compile: es la que está por defecto si no ponemos la etiqueta <scope>. Compila dependencias para que estén disponibles en todas las rutas de las clases (classpaths). Por otra parte, esas dependencias se propagan a los proyectos dependientes.
  • provided: similar a “compile”, salvo que necesita un JDK o un contenedor para proveer de tiempo de ejecución. Solo disponible en los classpath de compilación y de pruebas, no es transitivo.
  • runtime: indica que la dependencia no se requiere para compilar, sino que se necesita en tiempo de ejecución. Estará en los classpaths de tiempo de ejecución y pruebas, pero no en el de compilación.
  • test: indica que la dependencia no se requiere para un uso normal de la aplicación, y solo estará disponible para la compilación de las pruebas y las fases de ejecución.
  • system: similar a “provided”, excepto que requiere que le importes el JAR manualmente. El artefacto estará siempre disponible y no se buscará en el repositorio

35.7.4 Dependencies

Formado por una lista de etiquetas dependency
Estas dependency son librerías y se pueden obtener en mavenrepository.

35.7.5 Compilador

Para cambiar la versión de java en pom.xml:

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>
Para Junit 4:
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

35.8 Ejemplos

35.8.1 Eclipse, maven dynamic web project

https://www.learnbestcoding.com/post/1/how-to-setup-a-dynamic-web-project-with-maven-and-eclipse#projectWizard

35.8.2 Uso librería GSON

Usaremos estos ejemplos de github.

Un ejemplo sencillo, creamos un objeto Map y lo convertimos en Json:

package edu.dam1;

import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;

public class GsonToJson {

    public static void main(String[] args) {

        Map<Integer, String> colours = new HashMap<>();
        colours.put(1, "blue");
        colours.put(2, "yellow");
        colours.put(3, "green");

        Gson gson = new Gson();

        String output = gson.toJson(colours);

        System.out.println(output);
    }
}
  1. Creamos un proyecto java gsontojson.
  2. Vamos a necesitar la librería Gson de google.
  3. Descargamos directamente el archivo jar.
  4. Instalamos la librería gson.jar
    1. Botón derecho sobre el proyecto
    2. Seleccionamos "Build Path"
    3. Configure Build Path
    4. Libraries and select Add External JARs.
    5. Seleccionamos el gson.jar
    6. Apply and Ok
  5. ejecutar

Seguramente Eclipse nos indique que no conoce com.google.gson.Gson. El asistente nos sugiere crear o añadir esta dependencia al módulo, elegimos esta última opción.

Hemos usado java 1.7 y la libreria Gson compatible ¿Como haríamos para usar java 8 o java 9. Necesitamos cambiar las librerias de java y de Gson para tener un proyecto compatible.

En estos y otros casos maven facilita las tareas.

35.8.3 Proyecto con maven

El mismo ejemplo con maven. Empezamos creando un proyecto maven.

  1. New -> Project -> maven
  2. Desmarcamos "create a simple project" , usaremos un arquetipo simple
  3. Nombre del arquetipo: maven-archetype-quickstart
  4. Identifacmos el proyecto:
  5. Group id: edu.dam1
  6. Artifact id: mgsontojson ( ya existe gsontojson, usamos otro nombre)
  7. Finish

Se crea la estructura de directorios. Cambiamos el main generado por el de nuestra clase y los includes.
Nos indica que gson es desconocido.

Añadimos las dependencias en el fichro maven pom.xml:
1. Usando el editor integrado para pom en la pestaña dependencies 1. En la nueva ventana ponemos "gson" en el filtro. 2. seleccionamos com.google.code.gson. En el fichero pom.xml ha añadido las dependencias.

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.9.0</version>
    </dependency>
2. De forma manual: 1. Vamos a https://mvnrepository.com/ y buscamos gson 2. Seleccionamos el correspondiente a google y una versión 3. Nos muestra el texto para incluir en maven pom.xml, igual al anterios

Los dos caminos son equivalentes.

35.9 Maven plug-ins, goals and life cycle

35.9.1 Maven life cycle

Maven realiza la construcción (build) siguiendo un ciclo:, dividido en fases del ciclo: * Default (sin ejecución) * clean * site

Un ciclo se ejecuta con la invocación de los objetivos clean o site

Otras fases del ciclo:

  • validate: checks if the project is correct and all information is available
  • compile: compiles the source code into binary artifacts
  • test
  • package: takes the compiled code and package it, for example into a JAR file
  • integration-test: takes the packaged result and executes additional tests, which require the packagin
  • verify: Realiza las pruebas para ver que el paquete es valido
  • install: instala el paquete resultante en el repositorio ocal
  • deploy: por ejemplo, en un repositorio remoto.

Referencia completa life cycle

35.9.2 Plugins and goals(objetivos)

Los plugins proporcionan la funcionalidad para el proceso de construcción.

Cada plugin proporciona uno o más objetivos. Un objetivo en maven es "una unidad de trabajo"

35.9.3 Paquetes y "goal bindings.

Cada paquete contiene una lista de "binding for goals" para una fase del ciclo.

Por ejemplo el empaquetamiento de jar esta asociado( bind) a los siguientes objetivos del ciclo.

Table 2. Packaging goal
Life cycle phase Goal binding

process-resources

resources:resources

compile

compiler:compile

process-test-resources

resources:testResources

test-compile

compiler:testCompile

test

surefire:test

package

jar:jar

install

install:install

deploy

deploy:deploy

35.9.4 Añadir objetivos a las fases del ciclo de vida.

You can add goals to life cycle phases by configuring more Maven plug-ins and adding them to a life cycle in your pom file. You need to specify which goal should be executed. If the plug-in does not specify the default life cycle it should run, you must also specify the life cycle phase it should run.

<plugin>
   <groupId>com.vogella.example</groupId>
   <artifactId>vogella-some-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>verify</phase>
       <goals>
         <goal>checklinks</goal>
       </goals>
     </execution>
   </executions>
 </plugin>