Apache Maven

Herramienta de software para gestionar dependencias de compilación
Apache Maven
Desarrollador(es)La Fundación del Software Apache
Lanzamiento inicial13 de julio de 2004 ; hace 20 años ( 13 de julio de 2004 )
Versión estable
3.9.9 [1]  / 18 de agosto de 2024 ; hace 51 días ( 18 de agosto de 2024 )
Repositorio
  • github.com/apache/maven
Escrito enJava
TipoHerramienta de construcción
LicenciaLicencia Apache 2.0
Sitio webmaven.apache.org

Maven es una herramienta de automatización de compilación que se utiliza principalmente para proyectos Java . Maven también se puede utilizar para compilar y administrar proyectos escritos en C# , Ruby , Scala y otros lenguajes. El proyecto Maven está alojado por The Apache Software Foundation , donde anteriormente formaba parte del Proyecto Jakarta .

Maven aborda dos aspectos de la creación de software: cómo se crea el software y sus dependencias. A diferencia de herramientas anteriores como Apache Ant , utiliza convenciones para el procedimiento de creación. Solo es necesario especificar excepciones. Un archivo XML describe el proyecto de software que se está creando, sus dependencias de otros módulos y componentes externos, el orden de creación, los directorios y los complementos necesarios . Viene con objetivos predefinidos para realizar ciertas tareas bien definidas, como la compilación de código y su empaquetado. Maven descarga dinámicamente bibliotecas Java y complementos Maven de uno o más repositorios, como el Repositorio central de Maven 2, y los almacena en un caché local. [2] Este caché local de artefactos descargados también se puede actualizar con artefactos creados por proyectos locales. Los repositorios públicos también se pueden actualizar.

Maven se ha creado con una arquitectura basada en complementos que le permite utilizar cualquier aplicación que se pueda controlar mediante una entrada estándar. Se mantiene un complemento nativo de C / C++ para Maven 2. [3]

Las tecnologías alternativas como Gradle y sbt como herramientas de compilación no dependen de XML , pero mantienen los conceptos clave introducidos por Maven. Con Apache Ivy , también se desarrolló un administrador de dependencias dedicado que también admite repositorios Maven. [4]

Apache Maven tiene soporte para compilaciones reproducibles . [5] [6]

Historia

La cantidad de artefactos en el repositorio central de Maven ha crecido rápidamente

Maven fue creado por Jason van Zyl en 2002 y comenzó como un subproyecto de Apache Turbine . En 2003, Maven fue aceptado como proyecto de nivel superior de la Apache Software Foundation .

Historial de versiones:

  • Versión 1 - julio de 2004 - primer lanzamiento crítico (ahora al final de su vida útil).
  • Versión 2 - Octubre de 2005 - después de aproximadamente seis meses en ciclos beta (ahora al final de su vida útil).
  • Versión 3 - Octubre de 2010 - sigue siendo compatible en su mayor parte con proyectos Maven 2. Los cambios incluyeron la reelaboración del núcleo Project Builder y la compatibilidad con compilaciones paralelas. La reelaboración del núcleo desacopló la representación basada en archivos y en memoria y permitió que los complementos aprovecharan archivos de definición de proyectos no basados ​​en XML. Los lenguajes sugeridos incluyen Ruby (ya en prototipo privado de Jason van Zyl), YAML y Groovy . La función de compilación paralela aprovecha una cantidad configurable de núcleos en una máquina multinúcleo y es especialmente adecuada para proyectos grandes de varios módulos.
  • Versión 4 : actualmente en desarrollo beta (a mayo de 2024).

Sintaxis

Los proyectos Maven se configuran utilizando un modelo de objetos de proyecto (POM) en un pom.xmlarchivo.

Archivo de ejemplo:

<project> <!-- la versión del modelo siempre es 4.0.0 para los POM de Maven 2.x --> <modelVersion> 4.0.0 </modelVersion> <!-- coordenadas del proyecto, es decir, un grupo de valores que identifican de forma única este proyecto --> <groupId> com.mycompany.app </groupId> <artifactId> my-app </artifactId> <version> 1.0 </version>        <!-- dependencias de la biblioteca --> <dependencias>  <!-- Las coordenadas de una biblioteca requerida.  El alcance es 'test' para indicar que la biblioteca  solo se usa para ejecutar pruebas. --> <dependency> <groupId> org.junit.jupiter </groupId> <artifactId> junit-jupiter-engine </artifactId> <version> 5.9.1 </version> <scope> test </scope> </dependency>       </dependencias> </proyecto>

Este POM define un identificador único para el proyecto ( coordinates ) y una única dependencia de la biblioteca JUnit . Sin embargo, eso ya es suficiente para construir el proyecto y ejecutar las pruebas unitarias asociadas con el proyecto. Maven logra esto adoptando la idea de Convención sobre Configuración , es decir, Maven proporciona valores predeterminados para la configuración del proyecto.

La estructura de directorio de un proyecto Maven idiomático normal tiene las siguientes entradas de directorio:

Una estructura de directorio para un proyecto Java generado automáticamente por Maven
Nombre del directorioObjetivo
Proyecto casaContiene el pom.xmly todos los subdirectorios.
src/main/javaContiene el código fuente Java entregable para el proyecto.
src/main/resourcesContiene los recursos entregables para el proyecto, como los archivos de propiedad.
src/test/javaContiene el código fuente de Java de prueba (casos de prueba JUnit o TestNG, por ejemplo) para el proyecto.
src/test/resourcesContiene recursos necesarios para realizar pruebas.

El comando mvn packagecompilará todos los archivos Java, ejecutará todas las pruebas y empaquetará el código entregable y los recursos en target/my-app-1.0.jar(asumiendo que el artefactoId es my-app y la versión es 1.0).

Al utilizar Maven, el usuario solo proporciona la configuración para el proyecto, mientras que los complementos configurables hacen el trabajo real de compilar el proyecto, limpiar los directorios de destino, ejecutar pruebas unitarias, generar documentación de API, etc. En general, los usuarios no deberían tener que escribir complementos por sí mismos. Comparemos esto con Ant y make , en los que uno escribe procedimientos imperativos para realizar las tareas mencionadas anteriormente.

Diseño

Modelo de objeto del proyecto

Un modelo de objetos de proyecto (POM) [7] proporciona toda la configuración para un único proyecto. La configuración general cubre el nombre del proyecto, su propietario y sus dependencias en otros proyectos. También se pueden configurar fases individuales del proceso de compilación, que se implementan como complementos . Por ejemplo, se puede configurar el complemento del compilador para que utilice la versión 1.5 de Java para la compilación, o especificar el empaquetado del proyecto incluso si algunas pruebas unitarias fallan.

Los proyectos más grandes se deben dividir en varios módulos o subproyectos, cada uno con su propio POM. Luego se puede escribir un POM raíz a través del cual se pueden compilar todos los módulos con un solo comando. Los POM también pueden heredar la configuración de otros POM. Todos los POM heredan del Super POM [8] de manera predeterminada. El Super POM proporciona una configuración predeterminada, como directorios de origen predeterminados, complementos predeterminados, etc.

Complementos

La mayor parte de la funcionalidad de Maven se encuentra en complementos . Un complemento proporciona un conjunto de objetivos que se pueden ejecutar mediante el comando mvn [plugin-name]:[goal-name]. Por ejemplo, un proyecto Java se puede compilar con el objetivo de compilación del complemento del compilador [9] ejecutando mvn compiler:compile.

Existen complementos de Maven para compilar, probar, administrar el control de código fuente, ejecutar un servidor web, generar archivos de proyecto Eclipse y mucho más. [10] Los complementos se introducen y configuran en una sección <plugins> de un pom.xmlarchivo. Algunos complementos básicos se incluyen en cada proyecto de forma predeterminada y tienen configuraciones predeterminadas razonables.

Sin embargo, sería complicado si la secuencia de construcción arquetípica de crear, probar y empaquetar un proyecto de software requiriera ejecutar cada objetivo respectivo manualmente:

  • mvn compiler:compile
  • mvn surefire:test
  • mvn jar:jar

El concepto de ciclo de vida de Maven aborda este problema.

Los complementos son la forma principal de ampliar Maven. El desarrollo de un complemento Maven se puede realizar ampliando la clase org.apache.maven.plugin.AbstractMojo. En el artículo Automatizar el desarrollo y la gestión de máquinas virtuales en la nube se proporciona un código de ejemplo y una explicación de un complemento Maven para crear una máquina virtual basada en la nube que ejecute un servidor de aplicaciones . [11]

Construir ciclos de vida

El ciclo de vida de la compilación es una lista de fases con nombre que se pueden utilizar para dar orden a la ejecución de un objetivo. Uno de los tres ciclos de vida estándar de Maven es el ciclo de vida predeterminado , que incluye las siguientes fases, ejecutadas en el orden indicado: [12]

  • validar
  • generar-fuentes
  • fuentes de proceso
  • generar recursos
  • recursos del proceso
  • compilar
  • fuentes de prueba de proceso
  • recursos de prueba de proceso
  • prueba-compilación
  • prueba
  • paquete
  • instalar
  • desplegar

Los objetivos proporcionados por los complementos se pueden asociar con diferentes fases del ciclo de vida. Por ejemplo, de forma predeterminada, el objetivo compiler:compilese asocia con la compilefase, mientras que el objetivo surefire:testse asocia con la testfase. Cuando mvn testse ejecuta el comando, Maven ejecuta todos los objetivos asociados con cada una de las fases hasta la testfase incluida. En tal caso, Maven ejecuta el resources:resourcesobjetivo asociado con la process-resourcesfase, luego compiler:compile, y así sucesivamente hasta que finalmente ejecuta el surefire:testobjetivo.

Maven también tiene fases estándar para limpiar el proyecto y para generar un sitio de proyecto. Si la limpieza fuera parte del ciclo de vida predeterminado, el proyecto se limpiaría cada vez que se creara. Esto es claramente indeseable, por lo que se le ha dado a la limpieza su propio ciclo de vida.

Los ciclos de vida estándar permiten a los usuarios nuevos en un proyecto la capacidad de crear, probar e instalar con precisión cada proyecto Maven emitiendo un único comando mvn install. De forma predeterminada, Maven empaqueta el archivo POM en archivos JAR y WAR generados. Herramientas como diet4j [13] pueden usar esta información para resolver y ejecutar de forma recursiva módulos Maven en tiempo de ejecución sin necesidad de un archivo jar "super" que contenga todo el código del proyecto.

Dependencias

Una característica central de Maven es la gestión de dependencias . El mecanismo de gestión de dependencias de Maven está organizado en torno a un sistema de coordenadas que identifica artefactos individuales, como bibliotecas de software o módulos. El ejemplo de POM anterior hace referencia a las coordenadas de JUnit como una dependencia directa del proyecto. Un proyecto que necesita, por ejemplo, la biblioteca Hibernate simplemente tiene que declarar las coordenadas del proyecto de Hibernate en su POM. Maven descargará automáticamente la dependencia y las dependencias que Hibernate mismo necesita (llamadas dependencias transitivas ) y las almacenará en el repositorio local del usuario. El Repositorio central de Maven 2 [2] se utiliza de forma predeterminada para buscar bibliotecas, pero se pueden configurar los repositorios que se utilizarán (por ejemplo, repositorios privados de la empresa) dentro del POM.

La diferencia fundamental entre Maven y Ant es que el diseño de Maven considera que todos los proyectos tienen una estructura determinada y un conjunto de flujos de trabajo de tareas compatibles (por ejemplo, obtener recursos del control de código fuente, compilar el proyecto, realizar pruebas unitarias, etc.). Si bien la mayoría de los proyectos de software admiten estas operaciones y tienen una estructura bien definida, Maven requiere que esta estructura y los detalles de implementación de la operación se definan en el archivo POM. Por lo tanto, Maven se basa en una convención sobre cómo definir proyectos y en la lista de flujos de trabajo que generalmente se admiten en todos los proyectos. [14]

Existen motores de búsqueda como The Central Repository Search Engine, [15] que se pueden utilizar para encontrar coordenadas de diferentes bibliotecas y marcos de código abierto.

Los proyectos desarrollados en una sola máquina pueden depender entre sí a través del repositorio local. El repositorio local es una estructura de carpetas simple que actúa como caché para las dependencias descargadas y como lugar de almacenamiento centralizado para los artefactos creados localmente. El comando Maven mvn installcrea un proyecto y coloca sus binarios en el repositorio local. Luego, otros proyectos pueden utilizar este proyecto especificando sus coordenadas en sus POM.

Interoperabilidad

Existen complementos para varios entornos de desarrollo integrados (IDE) populares que apuntan al lenguaje de programación Java para proporcionar la integración de Maven con el mecanismo de compilación del IDE y las herramientas de edición de código fuente, lo que permite a Maven compilar proyectos desde dentro del IDE y también establecer la ruta de clase para completar el código, resaltar errores del compilador, etc.

Algunos ejemplos de IDE populares que admiten el desarrollo con Maven incluyen:

Estos complementos también brindan la capacidad de editar el POM o usar el POM para determinar el conjunto completo de dependencias de un proyecto directamente dentro del IDE.

Algunas de las características integradas de los IDE se pierden cuando el IDE ya no realiza la compilación. Por ejemplo, JDT de Eclipse tiene la capacidad de volver a compilar un único archivo fuente de Java después de haberlo editado. Muchos IDE trabajan con un conjunto plano de proyectos en lugar de la jerarquía de carpetas que prefiere Maven. Esto complica el uso de sistemas SCM en IDE cuando se utiliza Maven. [16] [17] [18]

Véase también

Referencias

  1. ^ "Notas de la versión - Maven - Versión 3.9.9". 18 de agosto de 2024 . Consultado el 5 de septiembre de 2024 .
  2. ^ ab "Índice de /maven2/". Archivado desde el original el 17 de septiembre de 2018. Consultado el 15 de abril de 2009 .
  3. ^ Laugstol, Trygve. "Complemento Maven nativo de MojoHaus".
  4. ^ "Resolución IBiblio | Apache Ivy™".
  5. ^ "Compilaciones reproducibles/verificables - Apache Maven - Apache Software Foundation". cwiki.apache.org .
  6. ^ "Compilaciones reproducibles en Java - DZone Java". dzone.com .
  7. ^ Referencia POM
  8. ^ Súper POM
  9. ^ Punzalan, Edwin. "Plugin del compilador Apache Maven: introducción".
  10. ^ Marbaise, Brett Porter Jason van Zyl Dennis Lundberg Olivier Lamy Benson Margulies Karl-Heinz. "Maven – Complementos disponibles".
  11. ^ Amies, Alex; Zou PX; Wang Yi S (29 de octubre de 2011). "Automatizar el desarrollo y la gestión de máquinas virtuales en la nube". IBM DeveloperWorks . IBM.
  12. ^ Porter, Brett. "Maven: Introducción al ciclo de vida de la compilación".
  13. ^ "diet4j: ponga a dieta los JAR de Java y cargue módulos maven según sea necesario".
  14. ^ "Maven: The Complete Reference". Sonatype. Archivado desde el original el 21 de abril de 2013. Consultado el 11 de abril de 2013 .
  15. ^ El motor de búsqueda del repositorio central
  16. ^ "maven.apache.org/eclipse-plugin.html". Archivado desde el original el 7 de mayo de 2015.
  17. ^ "IntelliJ IDEA :: Características". Archivado desde el original el 24 de mayo de 2015. Consultado el 2 de septiembre de 2009 .
  18. ^ "MavenBestPractices - Wiki de NetBeans". Archivado desde el original el 14 de enero de 2018. Consultado el 2 de septiembre de 2009 .

Lectura adicional

  • O'Brien, Tim; et al. "Maven: The Complete Reference". Sonatype.com . Sonatype . Consultado el 15 de marzo de 2013 .
  • Maven: la guía definitiva. Compañía Sonatype. O'Reilly Media, Inc. 2009. pág. 470.ISBN 9780596551780. Consultado el 17 de abril de 2013 .{{cite book}}: Mantenimiento de CS1: otros ( enlace )
  • Van Zyl, Jason (1 de octubre de 2008), Maven: Guía definitiva (primera edición), O'Reilly Media , págs. 468, ISBN 978-0-596-51733-5
  • "Ejecución de pruebas JUnit desde Maven2". JUnit en acción (2.ª edición). Manning Publications . 2011. págs. 152–168. ISBN 978-1-935182-02-3.
  • Personalización de compilación de Maven . Packt. 2013. págs. 1–250. ISBN 9781783987221.
  • Dominando Apache Maven 3. Paquete. 2014. pág. 298.ISBN 9781783983865.
  • Sitio web oficial
Obtenido de "https://es.wikipedia.org/w/index.php?title=Apache_Maven&oldid=1249159427"