Apache experto

Apache experto
Tipo de Automatización de compilación y sistema de gestión de paquetes
Desarrollador Fundación de software Apache
Escrito en Java [3] [4] [5]
Sistema operativo multiplataforma
Primera edición 1 de febrero de 2008 [1]
plataforma de hardware máquina virtual de Java
ultima versión
Formatos de archivo legibles metadatos expertos [d]
Formatos de archivo generados metadatos expertos [d]
Licencia Licencia Apache 2.0
Sitio web maven.apache.org
 Archivos multimedia en Wikimedia Commons

Apache Maven  es un marco para automatizar el ensamblaje de proyectos basado en la descripción de su estructura en archivos en el lenguaje POM ( Project Object Model ) ,  que es un subconjunto de XML [6] . El proyecto Maven es publicado por Apache Software Foundation , donde forma parte formalmente del Proyecto Jakarta .

El nombre del sistema es una palabra yiddish , cuyo significado puede expresarse aproximadamente como "recolector de conocimientos" [7] .

Maven proporciona una compilación de proyecto declarativa , no imperativa (a diferencia de la herramienta de automatización de compilación Apache Ant ). Los archivos de descripción del proyecto contienen la especificación del proyecto, no los comandos de ejecución individuales. Todas las tareas de procesamiento de archivos descritas en la especificación son manejadas por Maven a través de una serie de complementos integrados y externos.

Maven se utiliza para construir y gestionar proyectos escritos en JavaC#RubyScala y otros lenguajes [8] .

Las alternativas notables incluyen el sistema de compilación automatizado Gradle , que se basa en los principios de Apache Ant y Maven, pero usa un Groovy DSL especializado en lugar de una configuración POM.

Historial de desarrollo

Maven fue creado por el canadiense Jason van Zyl y Sonatype , una firma que fundó . Comenzó como un subproyecto de Apache Turbine en 2002, y en 2003 Maven fue calificado como un proyecto Apache de nivel superior, al mismo tiempo apareció su primera versión: Maven 1.x, publicada el 13 de julio de 2004 como versión 1.0. Sin embargo, esto sucedió tan rápido que no se pensaron en algunos detalles, por ejemplo, demasiada configuración, problemas de rendimiento.

Por lo tanto, se finalizó el concepto y en 2005 se inició el desarrollo paralelo de Maven 2.x, que se entregó en la versión 2.0 el 19 de octubre de 2005. [9]

Maven 1.x no está más desarrollado y se limita a la asistencia al usuario y la corrección de errores. [diez]

El desarrollo de Maven 3.0 comenzó en 2008. Después de ocho versiones alfa, la primera versión beta de Maven 3.0 se publicó en octubre de 2010. Se ha prestado especial atención a su compatibilidad con versiones anteriores de Maven 2. Para la mayoría de los proyectos, pasar de Maven 2 a Maven 3 no requiere ningún cambio [11] .

El desarrollo de Maven tiene lugar en los siguientes subproyectos:

Descripción del proyecto Modelo de objetos

La información para construir un proyecto compatible con Apache Maven está contenida en un archivo XML llamado pom.xml . Al iniciar, Maven verifica que el archivo de configuración contenga todos los datos requeridos y que todos los datos sean sintácticamente correctos.

Un ejemplo de archivo pom.xml :

<proyecto> <!-- la versión del modelo para Maven 2.x POM siempre es 4.0.0 --> <modeloVersión> 4.0.0 </modeloVersión> <!-- coordenadas del proyecto, es decir, un conjunto de valores que le permite identificar de forma única este proyecto --> <groupId> com.mycompany.app </groupId> <artifactId> my-app </artifactId> <version> 1.0 </version> <!-- dependencias de la biblioteca --> <dependencias> <dependencias> <!-- coordenadas de la biblioteca requerida --> <groupId> junit </groupId> <artifactId> junit </artifactId> <versión> 3.8.1 </versión> <!-- esta biblioteca solo se usa para ejecutar y compilar pruebas --> <alcance> prueba </alcance> </dependencia> </dependencias> </proyecto>

La configuración mínima incluye la versión del archivo de configuración, el nombre del proyecto, su autor y la versión [12] . Usando pom.xml , se configuran dependencias en otros proyectos, fases individuales del proceso de construcción del proyecto (proceso de construcción), una lista de complementos que implementan el orden de construcción [12] .

Los proyectos grandes se pueden dividir en varios módulos o subproyectos, cada uno con su propio POM. Las operaciones en los módulos se pueden realizar a través de un POM raíz común con un solo comando.

Los archivos POM de subproyecto pueden heredar la configuración de otros archivos de configuración. Al mismo tiempo, todos los archivos de configuración se heredan necesariamente del archivo "Super POM" [13] de forma predeterminada. El Super POM proporciona una configuración predeterminada, como una estructura de directorio predeterminada, complementos predeterminados, vinculación a las fases del ciclo de vida y más.

Conceptos básicos

Convenciones de configuración

Maven admite el principio de convención por configuración , que es que un aspecto en cuestión necesita una configuración si y solo si ese aspecto no satisface alguna especificación. Como consecuencia, esto reduce la cantidad de configuración requerida sin perder flexibilidad. Una consecuencia de este principio es que no hay necesidad de especificar rutas de archivo de forma explícita, lo que simplifica el contenido de pom.xml . Sin embargo, casi todos los estándares en los que se basa Maven se pueden cambiar mediante una configuración individual [14] [15] .

Arquetipos

Maven utiliza el principio de los arquetipos de Maven (Eng. Archetypes ). Un arquetipo es una herramienta de patrones, cada uno de los cuales está definido por un patrón o modelo, por analogía con el cual se crean derivados. [dieciséis]

La estructura de directorios predeterminada es una de las implementaciones de Maven del principio del arquetipo. La siguiente estructura muestra los directorios más importantes para un proyecto Java [17] :

  • Directorio raíz del proyecto : archivo pom.xml y todos los demás subdirectorios
    • src : todos los archivos fuente
      • src/main : archivos fuente para el producto en sí
        • src/main/java : fuente de Java
        • src/main/resources : otros archivos que se usan durante la compilación o ejecución, como archivos de propiedades
      • src/test : archivos fuente necesarios para configurar pruebas automáticas
        • src/test/java : casos de prueba JUnit para pruebas automatizadas
    • objetivo : todos los archivos creados durante el trabajo de Maven
      • target/classes : clases de Java compiladas

Ciclo de vida

El ciclo de vida de un proyecto maven es una lista de fases con nombre que determina el orden de las acciones cuando se construye. El ciclo de vida de Maven contiene tres órdenes de ejecución independientes: [18]

  • clean - ciclo de vida para limpiar el proyecto. Contiene las siguientes fases:
    1. limpieza previa
    2. limpio
    3. publicación limpia
  • por defecto es el ciclo de vida principal que contiene las siguientes fases:
    1. validar: comprueba si la estructura del proyecto está completa y es correcta.
    2. generar fuentes
    3. fuentes de proceso
    4. generar recursos
    5. recursos de proceso
    6. compilar: las fuentes se compilan.
    7. fuentes de prueba de proceso
    8. proceso-prueba-recursos
    9. compilación de prueba
    10. prueba: el código ensamblado se prueba mediante un conjunto de pruebas preparadas previamente.
    11. paquete - empaquetado de clases compiladas y otros recursos. Por ejemplo, en un archivo JAR.
    12. prueba de integración: el software en su conjunto o sus módulos grandes se someten a pruebas de integración. Se comprueba la interacción entre los componentes del producto de software.
    13. install: instale el software en el repositorio local de Maven para que esté disponible para otros proyectos del usuario actual.
    14. deployment: una versión estable del software se distribuye a un repositorio remoto de Maven para que esté disponible para otros usuarios.
  • sitio - ciclo de vida de la generación de la documentación del proyecto. Consta de fases:
    1. pre-sitio
    2. sitio
    3. sitio de publicación
    4. implementación del sitio

Los ciclos de vida estándar se pueden mejorar con la funcionalidad mediante los complementos de Maven. Los complementos le permiten insertar nuevos pasos en el ciclo estándar (por ejemplo, distribución al servidor de aplicaciones) o ampliar los pasos existentes.

Arquitectura

Maven se basa en una arquitectura de complementos que le permite usar complementos para varias tareas ( compilar ,  probar, construir, implementar, verificar estilo, pmd, scp-transfer ) para un proyecto determinado, sin tener que instalarlos explícitamente. Esto es posible debido al hecho de que la información llega al complemento a través de la entrada estándar y los resultados se escriben en su salida estándar. En teoría, esto permite que cualquiera pueda escribir complementos para interactuar con las herramientas de compilación del proyecto (compiladores, herramientas de prueba, etc.) para cualquier otro idioma. En realidad, el soporte para lenguajes distintos a Java actualmente es mínimo. Hay un complemento para .NET framework [19] , así como complementos para C / C++ [20] [21] .

La cantidad de complementos disponibles actualmente es muy grande e incluye, entre otras cosas, complementos que le permiten ejecutar una aplicación web directamente desde Maven para probarla en un navegador; complementos que le permiten probar o crear bancos de datos; complementos que le permiten generar Servicios Web. La tarea del desarrollador en tal situación es encontrar y aplicar el conjunto de complementos más adecuado.

El complemento logra una serie de objetivos con la siguiente sintaxis:

mvn [nombre del complemento]:[nombre del objetivo]

Por ejemplo, un proyecto Java se puede compilar con un complemento del compilador [22] ejecutando el comando mvn compiler:compile.

Hay complementos de Maven para compilar, probar, controlar la fuente, ejecutar un servidor web, generar archivos de proyecto de Eclipse y más. [23] Los complementos se enumeran y configuran en una sección del <plugins>archivo pom.xml . Algún grupo básico de complementos se incluye en cada proyecto de forma predeterminada.

Dependencias

El archivo pom.xml especifica las dependencias que tiene un proyecto administrado por Maven. El administrador de dependencias se basa en varios principios fundamentales:

  • Repositorios. Maven busca los archivos necesarios en los directorios locales o en el repositorio maven local. Si la dependencia no se puede resolver localmente, Maven se conecta al repositorio maven especificado en la red y se copia en el repositorio local. Maven usa el repositorio central de Maven [24] de forma predeterminada , pero el desarrollador puede configurar otros repositorios públicos de Maven, como Apache, Ibiblio, Codehaus o Java.Net.
  • dependencias transitivas. Las bibliotecas necesarias se cargan en el proyecto automáticamente. Al resolver conflictos de versión, se utiliza el principio de la dependencia "más cercana", es decir, se selecciona la dependencia, la ruta a la que a través de la lista de proyectos dependientes es la más corta.
  • Eliminar dependencias. El archivo de descripción del proyecto brinda la capacidad de excluir una dependencia en caso de detección de ciclicidad o falta de necesidad de una biblioteca en particular.
  • Buscar dependencias. Las dependencias (bibliotecas y módulos de código abierto) se buscan por sus coordenadas (ID de grupo, ID de artefacto y versión). Estas coordenadas se pueden determinar utilizando motores de búsqueda especiales, como el motor de búsqueda Maven [25] . Por ejemplo, para el atributo de búsqueda "pop3", el motor de búsqueda devuelve un resultado con groupId="com.sun.mail" y artefactoId="pop3".
  • Administradores de repositorios. Los repositorios se implementan utilizando Maven Repository Managers como Apache Archiva, Nexus (anteriormente Proximity), Artifactory, Codehaus Maven Proxy o Dead Simple Maven Proxy [26] .

Un ámbito de dependencia le permite incluir dependencias solo en una etapa determinada de la creación del proyecto. Hay 6 áreas posibles [27] :

  1. compilar. El área predeterminada. La dependencia está disponible en todas las rutas de búsqueda de clases en el proyecto. Distribuido a proyectos dependientes.
  2. previsto. El alcance es similar a compilar, excepto que el JDK o el contenedor en sí mismo proporcionarán la dependencia en tiempo de ejecución.
  3. tiempo de ejecución La dependencia no es necesaria para la compilación, pero sí para la ejecución.
  4. prueba. La dependencia no es necesaria para el funcionamiento normal de la aplicación, pero solo es necesaria para compilar y ejecutar pruebas.
  5. sistema. El alcance es similar al provisto, excepto que el JAR que contiene la dependencia se especifica explícitamente. El artefacto no se busca en el repositorio.
  6. import (desde Maven 2.0.9) solo se usa con una dependencia pom en el <dependencyManagement>. Las dependencias del POM actual se reemplazan con las dependencias del POM especificado.

Hacer que el proyecto se parezca a Maven

Un proyecto mantenido con Maven debe cumplir ciertas condiciones para que la utilidad pueda leerlo, analizarlo y construirlo. Esto impone algunas restricciones en la estructura del directorio y requiere pasos adicionales si el proyecto inicialmente tiene una estructura diferente. [28]

Para que Maven reconozca un proyecto como procesado, debe contener una estructura de directorio establecida. Todos los archivos de código fuente deben estar ubicados en la ruta relativa " \src\main\java " [17] .

El archivo de configuración del proyecto web web.xml debe estar ubicado en el directorio \src\main\webapp\WEB-INF [17 ] .

El archivo de configuración pom.xml de un proyecto Maven debe estar ubicado en el directorio raíz del proyecto. Según su propósito, puede contener un repositorio remoto, complementos para crear archivos, un complemento de compilación, etc. El proyecto web también necesita agregar dependencias adicionales, como javaee.jar.

Entonces, el archivo de configuración del proyecto web de salida, de acuerdo con Maven, se ve así:

<proyecto 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/maven-v4_0_0.xsd" > <versión del modelo> 4.0.0 </versión del modelo> <identificación del grupo> com.mkyong </identificación del grupo> < artefactoId> servletdemo </artifactId> <paquete> guerra </paquete> <versión> 1.0-SNAPSHOT </versión> <nombre> servletdemo </nombre> <url> http://maven.apache.org </url> <repositorios> <repositorio> <id> java.net </id> <url> http://download.java.net/maven/2 </url> </repositorio> </repositorios> <compilación> <complementos> <complemento> <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-war-plugin </artifactId> <configuración> <webResources> <recurso> <directorio> ${basedir }/src/main/java </directory> <targetPath> WEB-INF/classes </targetPath> <includes> <include> **/*.properties </include> <include> **/*.xml </ include> <include> **/*.css </include> <include> **/*.html </include> </includes> </resource> </webResources> </configuration> </plugin> <plugin > <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.6 </source> <target> 1.6 </target> </configuration> </plugin> </plugins> </build> </ proyecto>

Una vez que se han cumplido todos los requisitos anteriores, el proyecto Maven está listo para realizar las fases del ciclo de vida, como la compilación, la creación de archivos y la generación de documentación [29] .

Un ejemplo del registro de salida de mensajes al ejecutar el comando mvn war:war:

E:\espacio de trabajo\servletdemo>mvnwar:war [INFO] Buscando proyectos... ....... [INFO] Proyecto de guerra de procesamiento [INFO] Copiando recursos de aplicaciones web [E:\workspace\servletdemo] [INFO] Webapp ensamblada en [47 mseg] [INFO] Guerra de construcción: E:\workspace\servletdemo\target\servletdemo-1.0-SNAPSHOT.war [INFORMACION]----------------------------------------------- ----- [INFO] CONSTRUCCIÓN EXITOSA [INFORMACION]----------------------------------------------- -----

Interacción con entornos de desarrollo

Para algunos IDE, Maven proporciona complementos que le permiten administrar el ciclo de vida mediante la ejecución de comandos mediante la interfaz IDE. La lista de dichos entornos de desarrollo incluye Eclipse (a través del complemento M2eclipse ), IntelliJ IDEA , NetBeans , JBuilder , JDeveloper (versión 11.1.2), MyEclipse, Emacs [30]

Estos complementos también brindan la capacidad de editar convenientemente el POM o usar el POM para describir completamente las dependencias del proyecto para las necesidades del IDE que está usando.

Notas

  1. CrunchBase  (inglés) - 2007.
  2. https://maven.apache.org/docs/3.8.6/release-notes.html
  3. https://www.zhihu.com/question/20297619
  4. El proyecto de código abierto maven2 en Open Hub: página de idiomas - 2006.
  5. https://projects.apache.org/json/projects/maven.json
  6. Copia archivada (enlace no disponible) . Consultado el 26 de febrero de 2012. Archivado desde el original el 19 de febrero de 2012.   POM
  7. Maven - ¿Qué es Maven? . Consultado el 25 de febrero de 2012. Archivado desde el original el 21 de febrero de 2012.
  8. Comunidad Apache Maven. Complemento del compilador Apache Maven . Proyecto Apache Maven . Fecha de acceso: 18 de diciembre de 2015. Archivado desde el original el 13 de diciembre de 2015.
  9. Archivo histórico de versiones de Maven . Archivado el 11 de febrero de 2012 en Wayback Machine .
  10. Página oficial de Maven 1.x Archivado el 15 de febrero de 2012.
  11. ↑ 1 2 Fundación Apache Maven. Historial de versiones de Maven . Documentos de Apache Maven . Consultado el 20 de diciembre de 2015. Archivado desde el original el 19 de diciembre de 2015.
  12. ↑ 1 2 Fundamentos de Apache. El contenido mínimo de un archivo POM es . Proyecto Apache Maven . Consultado el 6 de octubre de 2007. Archivado desde el original el 19 de noviembre de 2017.
  13. Super POM Archivado el 19 de noviembre de 2017 en Wayback Machine .
  14. Maven by Example Archivado el 15 de septiembre de 2020 en Wayback Machine .
  15. ¿Qué es Convención sobre Configuración? . Consultado el 28 de octubre de 2016. Archivado desde el original el 14 de septiembre de 2016.
  16. Fundación Apache Maven. Documentación de Maven. Arquetipos. . Fecha de acceso: 18 de diciembre de 2015. Archivado desde el original el 22 de diciembre de 2015.
  17. ↑ 1 2 3 Página oficial de Apache Maven: Estructura del directorio Archivado el 21 de febrero de 2012 en Wayback Machine .
  18. Maven Build Lifecycle Reference Archivado el 17 de noviembre de 2017 en Wayback Machine .
  19. Complemento .NET Maven Archivado el 27 de octubre de 2016 en Wayback Machine .
  20. Complemento nativo de Maven Archivado el 29 de octubre de 2016 en Wayback Machine .
  21. Complemento NAR Archivado el 20 de diciembre de 2017 en Wayback Machine .
  22. ↑ Complemento del compilador Maven Archivado el 15 de diciembre de 2017 en Wayback Machine .
  23. Maven: Complementos disponibles Archivado el 24 de julio de 2017 en Wayback Machine .
  24. Repositorio central de Maven Archivado el 26 de abril de 2020 en Wayback Machine .
  25. Motor de búsqueda Maven Archivado el 26 de abril de 2020 en Wayback Machine .
  26. Tabla de comparación Archivado el 23 de noviembre de 2012.
  27. Fundación Apache Maven. documentación experta. Una introducción al mecanismo de dependencia . Fecha de acceso: 18 de diciembre de 2015. Archivado desde el original el 20 de diciembre de 2015.
  28. Cómo convertir un proyecto web en un proyecto Maven Archivado el 21 de febrero de 2012 en Wayback Machine .
  29. Fundación Apache. Construyendo un Proyecto con Maven . Documentación de Apache Maven . Fecha de acceso: 21 de diciembre de 2015. Archivado desde el original el 3 de enero de 2016.
  30. EmacsWiki: Malabar Mode Archivado el 3 de noviembre de 2013 en Wayback Machine .

Enlaces

  • Vygovski Leonid. Instalación del repositorio maven de Artifactory (5 de enero de 2010). — Este artículo proporciona instrucciones detalladas sobre cómo instalar un repositorio maven en un servidor de aplicaciones Glassfish o un contenedor de servlet Apache Tomcat. Consultado el 5 de enero de 2010. Archivado el 29 de febrero de 2012.