====== Gestión de proyectos con Maven ======

===== ¿Qué es Maven? =====

===== Crear un proyecto con Maven ======

===== Añadir librerias (dependencias) a un proyecto ======

Para añadir una librería a un proyecto gestionado con Maven, primero tendremos que buscarla en el repositorio de la herramienta en [[https://mvnrepository.com/|Maven Repository]]. Una vez localizada la libreria y seleccionada su versión (tiene un buscador donde podéis buscar por nombre o descripción de la librería), tendremos que copiar el código XML que describe la libreria como dependencia y copiarla al fichero //pom.xml// de nuestro proyecto, dentro de las etiquetas ''<dependencies> . . . </dependencies>'' (Puedes ver un ejemplo [[https://datos.codeandcoke.com/apuntes:maven#fichero_pom_de_ejemplo|aqui]].

<figure>
{{ mvn_version_libreria.png }}
<caption>Búsqueda de librerías en el repositorio</caption></figure>

<figure>
{{ mvn_libreria.png }}
<caption>Información sobre una versión concreta de una librería</caption></figure>

<figure>
{{ xml_libreria_pom.png }}
<caption>XML para copiar al fichero pom.xml</caption></figure>
====== Ejemplos ======

===== Fichero POM de ejemplo =====

=== Dependencias para Hibernate y el driver JDBC de MySQL ===

Tendremos que incluir ambas dependencias dentro de las etiquetas ''<dependencies></dependencies>'' del fichero ''pom.xml''.

Para hibernate:
<code xml>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.7.Final</version>
</dependency>
</code>

Para MySQL:
<code xml>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>
</code>

=== Dependencia para generar javadoc ===

De forma similar, incluimos la dependencia para que podamos generar, utilizando Maven, la documentación //javadoc// de nuestro proyecto, que se creará cuando ejecutemos el //goal// ''javadoc:javadoc'' de Maven.
<code xml>
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.1</version>
</dependency>
</code>

=== Plugin para empaquetar la aplicación y sus dependencias como un único jar ejecutable ===

Tendremos que añadir un plugin de maven para generar ficheros //jar//:
<code xml>
. . .
</dependencies>
<build>
  <plugins>
    . . .
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
	  <goals>
	    <goal>single</goal>
	  </goals>
	  <configuration>
	    <archive>
	      <manifest>
                <mainClass>com.sfaci.ejemplohibernate.Aplicacion</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>
        </execution>
      </executions>
    </plugin>
    . . .
  </plugins>
</build>
</code>

=== Plugin para especificar la versión de Java con la que se debe compilar ===

<code xml>
. . .
</dependencies>
<build>
  <plugins>
    . . .
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    . . .
  </plugins>
</build>
</code>

=== Fichero pom.xml completo ===

Y a continuación un ejemplo completo de fichero ''pom.xml'' con todas las opciones que se han comentado, donde se puede ver dónde va cada una con respecto al resto del fichero.

<code xml>
<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>com.sfaci</groupId>
  <artifactId>ejemplohibernate</artifactId>
  <version>0.1</version>
  <name>Ejemplo Hibernate</name>
  <description>Proyecto de ejemplo con Hibernate</description>

  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.3.7.Final</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.13</version>
    </dependency>
    <dependency>
      <!-- Genera javadoc con el goal javadoc:javadoc -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>3.0.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <!-- Empaqueta la aplicación y sus dependencias en un solo jar -->
        <groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<executions>
	  <execution>
	    <phase>package</phase>
	    <goals>
	      <goal>single</goal>
	    </goals>
	    <configuration>
	      <archive>
	        <manifest>
                  <mainClass>com.sfaci.ejemplohibernate.Aplicacion</mainClass>
                </manifest>
	      </archive>
	      <descriptorRefs>
	        <descriptorRef>jar-with-dependencies</descriptorRef>
	      </descriptorRefs>
	    </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <!-- Especifica la versión de Java que emplea el proyecto -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
</code>

----

(c) 2016-2019 Santiago Faci

