¿Qué es Maven? Gestión de compilación y dependencia para Java

Apache Maven es una piedra angular del desarrollo de Java y la herramienta de gestión de compilación más utilizada para Java. El modelo de configuración optimizado basado en XML de Maven permite a los desarrolladores describir o comprender rápidamente los esquemas de cualquier proyecto basado en Java, lo que hace que iniciar y compartir nuevos proyectos sea muy sencillo. Maven también admite el desarrollo basado en pruebas, el mantenimiento de proyectos a largo plazo, y su configuración declarativa y su amplia gama de complementos lo convierten en una opción popular para CI / CD. Este artículo es una introducción rápida a Maven, que incluye el POM de Maven y la estructura de directorios, y los comandos para crear su primer proyecto de Maven.

Tenga en cuenta que la versión más reciente de Maven a la fecha de este escrito es Maven 3.6.3.

Maven vs Ant y Gradle

Maven no es la única herramienta de compilación en el ecosistema de Java, aunque es la más popular. Ant, una generación anterior de herramienta de configuración basada en XML, carece de las prácticas estandarizadas y basadas en convenciones y la gestión de dependencias de Maven, pero ofrece una flexibilidad que no encontrará con Maven. Gradle es una herramienta más nueva que se ejecuta sobre el ecosistema de Maven (usando los repositorios de Maven), pero admite el uso de un DSL basado en Groovy o Kotlin para la configuración. Las tres son buenas herramientas de construcción por derecho propio y cada una se puede integrar en un proceso de CI / CD. Lo importante es elegir el que mejor se adapte a tus necesidades y saber utilizarlo adecuadamente.

Cómo funciona Maven

Como muchas grandes herramientas, Maven toma lo que alguna vez fue demasiado complicado (infierno de configuración) y lo simplifica a partes digeribles. Maven consta de tres componentes:

  • El POM: el archivo que describe un proyecto de Maven y sus dependencias.
  • El directorio: el formato estandarizado para describir un proyecto de Maven en el POM.
  • Repositorios: donde se almacena y se descubre software de terceros.

El POM de Maven : cada proyecto Java que usa Maven tiene un archivo POM (modelo de objeto de proyecto) en su directorio raíz. La pom.xmldescribe las dependencias del proyecto y le indica cómo construirlo. (Las dependencias son software de terceros requerido por el proyecto. Algunos ejemplos comunes son JUnit y JDBC. Consulte el Repositorio central de Maven para obtener una lista de todas las herramientas disponibles y dependencias populares).

El directorio Maven : el directorio Maven implementa lo que se conoce como convención sobre la configuración , una elegante solución al infierno de la configuración. En lugar de requerir que los desarrolladores definan el diseño y configuren manualmente los componentes para cada nuevo proyecto (como fue el caso de makefileAnt), Maven instituye una estructura de proyecto común y ofrece un formato de archivo estándar para describir cómo funciona. Simplemente conecte sus requisitos y Maven llama a las dependencias y configura el proyecto por usted.

Repositorios centralizados : Finalmente, Maven utiliza repositorios centralizados para descubrir y publicar paquetes de proyectos como dependencias. Cuando haga referencia a una dependencia en su proyecto, Maven la descubrirá en el repositorio centralizado, la descargará en un repositorio local y la instalará en su proyecto. La mayoría de las veces, todo esto es invisible para usted como desarrollador.

Accediendo a las dependencias de Maven

De forma predeterminada, Maven resuelve las dependencias del repositorio central de Maven. Una alternativa común es JCenter, que tiene un conjunto más amplio de paquetes disponibles. Las organizaciones también publican y alojan repositorios internos, que pueden ser públicos o privados. Para acceder a un repositorio, especifique su URL en Maven POM, o puede indicarle a Maven que busque en otros repositorios.

Instalación de Maven

Maven es un proyecto de Java, por lo que antes de instalarlo, deberá tener el JDK instalado en su entorno de desarrollo. (Consulte "¿Qué es el JDK? Introducción al kit de desarrollo de Java" para obtener más información sobre cómo descargar e instalar el JDK).

Una vez que haya configurado su entorno de desarrollo Java, puede instalar Maven en solo unos pocos pasos:

  1. Descargue la última versión de Maven (Maven 3.6.3 a partir de este escrito).
  2. Extraiga el apache.mavenarchivo .zip en un lugar conveniente.
  3. Coloque ese archivo en su ruta. Por ejemplo, en un sistema Unix o Linux: exportar PATH=$PATH:/home/maven/.

Ahora debería tener acceso al mvncomando. Escriba mvn -vpara asegurarse de haber instalado Maven correctamente.

El Maven POM

La raíz de cada proyecto de Maven es el pom.xmlarchivo. A pesar de su reputación de tedioso, XML realmente funciona bastante bien para este caso de uso. El POM de Maven es fácil de leer y revela mucho de lo que sucede en un proyecto. (Si ha trabajado con JavaScript, el pom.xmlpropósito es similar al del package.jsonarchivo de Node NPM ).

El Listado 1 muestra un Maven muy simple pom.xml.

Listado 1. Simple Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Entendiendo el Maven POM

Una vez que lo domines, el POM no es un misterio. Para empezar, puede hojear el preámbulo XML, que solo hace referencia al esquema oficial de POM. modelVersionSin embargo, observe que el XML comienza con . Eso le dice a Maven qué versión de POM usar, en este caso Maven POM 4.0.0.

A continuación, usted tiene groupId, artifactIdy version. Juntos, estos tres atributos identifican de manera única cada recurso administrado por Maven en el repositorio. Estos atributos en la parte superior del archivo describen su proyecto Maven.

Ahora, eche un vistazo a la dependenciessección del POM, donde describimos las dependencias del proyecto. En este caso, hemos incluido una sola dependencia hasta ahora, JUnit. Tenga en cuenta que JUnit también se describe en términos de su groupId, artifactIdy version.

Ya sea que esté describiendo su propio proyecto o una dependencia del proyecto, estos valores le indican constantemente a Maven dónde encontrar un proyecto en el repositorio de Maven y qué versión está disponible para su uso.

Alojar su proyecto en un repositorio de Maven

Tenga en cuenta que el POM define todo lo que su proyecto necesita para ejecutarse, pero también describe su proyecto como una dependencia potencial. Si está creando un proyecto que será una dependencia, por ejemplo, creando una biblioteca para que la usen otros proyectos, deberá ponerlo a disposición de una de estas cuatro formas:

  1. Hágalo disponible localmente.
  2. Publique en un repositorio remoto administrado de forma privada.
  3. Publique en un repositorio privado basado en la nube.
  4. Publique en un repositorio público como Maven Central.

En el primer caso, no utiliza ningún repositorio remoto. En cambio, otros desarrolladores descargarán e instalarán su proyecto localmente en su repositorio de Maven, usando el mvn installcomando.

En el segundo caso, utiliza un repositorio Maven alojado, utilizando un servidor controlado de forma privada para publicar y descargar dependencias. Para ello, necesita un administrador de repositorios, como Apache Archiva.

Una alternativa más nueva es utilizar un repositorio remoto privado, pero confiar en un servicio basado en la nube para administrarlo, por ejemplo Cloudsmith. Esto brinda el beneficio de las dependencias alojadas de forma remota sin el trabajo de mantener un servidor de repositorio. Ese servicio es de pago, por supuesto.

Finalmente, un pequeño porcentaje de proyectos terminarán en el Repositorio Central Maven o JCenter, que están pensados ​​para paquetes públicos de uso generalizado. Si está creando una dependencia de código abierto para que la utilicen otros, necesitará uno de estos repositorios centralizados para que su trabajo esté disponible para el mundo.

  • Obtenga más información sobre cómo alojar su proyecto en un repositorio de Maven y obtenga una lista de los repositorios disponibles.
  • Consulte la documentación oficial de Maven sobre el complemento de lanzamiento de Maven, que se utiliza para preparar y administrar el software publicado en un repositorio de Maven.

Construye el paquete Maven

Si crea el pom.xmldesde el Listado 1 y lo coloca en un directorio, podrá ejecutar comandos de Maven en él. Maven tiene una multitud de comandos, y hay más disponibles a través de un complemento, pero solo necesita conocer algunos para comenzar.

Para su primer comando, intente ejecutar mvn package. Aunque aún no tiene ningún código fuente, la ejecución de este comando le indica a Maven que descargue la dependencia JUnit. Puede comprobar la salida de registro de Maven para ver que la dependencia se ha cargado.

Alcance de la dependencia

Es posible que haya notado que la dependencia JUnit en el ejemplo POM está marcada como scope test. El alcance es un concepto importante en la gestión de dependencias, que básicamente le permite definir y limitar cómo se llamará y utilizará cada dependencia en su proyecto. El testalcance garantiza que la dependencia esté disponible cuando se ejecutan pruebas, pero no cuando la aplicación está empaquetada para su implementación.

Otro ámbito común es provided, que le dice al marco que la dependencia la proporciona el entorno de ejecución. Esto se ve a menudo con los JARS de Servlet cuando se implementan en un contenedor de servlets, ya que el contenedor proporcionará esos JARS. Consulte la documentación de Apache Maven para obtener una lista completa de los ámbitos de dependencia de Maven.

Estructura de directorios de Maven

Cuando termine el comando, observe que Maven ha creado un /targetdirectorio. Esa es la ubicación estándar para la salida de su proyecto. Las dependencias que ha descargado residirán en el /targetdirectorio, junto con los artefactos de su aplicación compilada.

A continuación, desea agregar un archivo Java, que colocará en el src/directorio Maven . Cree un /src/main/java/com/javaworld/Hello.javaarchivo con el contenido del Listado 2.

Listado 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

La /srcruta es el lugar estándar para los archivos fuente de su proyecto. La mayoría de los proyectos colocan sus archivos principales /src/main/, y los archivos Java entran en la ruta de clase debajo /java. Además, si desea incluir activos que no sean código, como archivos de configuración o imágenes, puede usar /src/main/resources. Los activos en esta ruta se agregarán a la ruta de clases principal. Los archivos de prueba entran en /src/test/java.

Para revisar, aquí hay algunas partes clave de la estructura de un proyecto de Maven (según lo define la Estructura de directorio estándar de Maven):

Partes clave de la estructura de directorios estándar de Maven

pom.xml El archivo descriptor del proyecto
/ src / main / java Ubicación de los archivos de origen
/ src / main / resources Ubicación de activos ajenos a la fuente
/ src / test / java Ubicación de los archivos fuente de prueba
/objetivo Ubicación de la salida de la construcción

Gestionar su proyecto Maven

El mvn packagecomando le indica a Maven que agrupe el proyecto. Emita este comando cuando esté listo para recopilar todos los archivos de su proyecto en un solo lugar. Recuerde que en el archivo POM para este proyecto, configuramos el tipo de empaquetado para que sea jar, por lo que este comando le dice a Maven que empaque los archivos de la aplicación en un JAR.

Maven ofrece una variedad de opciones adicionales para controlar cómo se administra el JAR, ya sea un JAR grueso o delgado, y especificar un ejecutable mainclass. Consulte los documentos de Maven para obtener más información sobre la administración de archivos en Maven.

Después de agrupar un proyecto, es probable que desee emitir un mvn install. Este comando empuja el proyecto al repositorio local de Maven. Una vez que está en el repositorio local, está disponible para otros proyectos de Maven en su sistema local. Esto es útil para escenarios de desarrollo en los que usted y / o su equipo están creando JAR de dependencia que aún no se han publicado en un repositorio central.

Comandos adicionales de Maven

Ingrese mvn testcuando esté listo para ejecutar las pruebas unitarias que haya definido en el /src/java/testdirectorio.

Ingrese mvn compilecuando esté listo para compilar los archivos de clase del proyecto. Si está ejecutando una configuración de implementación en caliente, este comando activa el cargador de clases de implementación en caliente. (La herramienta de implementación en caliente, como el mvn spring-boot:runcomando de Spring Boot, observará los archivos de clase en busca de cambios, y la compilación hará que se compilen los archivos de origen y la aplicación en ejecución reflejará esos cambios).

Comenzando un nuevo proyecto: Arquetipos en Maven y Spring

Un arquetipo de Maven es una plantilla para iniciar nuevos proyectos basados ​​en una variedad de configuraciones predefinidas. Cada arquetipo ofrece dependencias empaquetadas previamente, como para un proyecto de aplicación web Java EE o Java. También puede crear un nuevo arquetipo a partir de un proyecto existente y luego usarlo para crear rápidamente nuevos proyectos basados ​​en esos diseños predefinidos. Consulte los documentos de Maven para obtener más información sobre los arquetipos de Apache Maven.

El marco Spring, que funciona bien con Maven, ofrece capacidades sofisticadas adicionales para eliminar proyectos nuevos. Como ejemplo, Spring Initializr es una herramienta que le permite definir muy rápidamente los elementos que desea en una nueva aplicación. Initializr no es un arquetipo de Maven, per se, pero tiene el mismo propósito de generar un diseño de proyecto basado en especificaciones iniciales. Desde Initializr, puede escribir mvn archetype:generatey explorar las opciones para encontrar un arquetipo que sea adecuado para lo que está construyendo.

Agregar dependencias