Grain Academy (5) --- Maven de la entrada al encantamiento

Prefacio

En nuestro desarrollo diario de proyectos javaee, para el desarrollo y gestión de una gran cantidad de módulos y la gestión de paquetes jar, inevitablemente diseñaremos maven para la gestión de proyectos. Aquí resumo algunos de los puntos de conocimiento más importantes de Maven, que también son Lo que he aprendido recientemente. Siento la importancia del uso de Maven en el proyecto de Grain Academy, por lo que resumiré algunos de los puntos de conocimiento más importantes en Maven, con la esperanza de proporcionar algo de ayuda a los compañeros de aprendizaje.
"Por fin, espero que mis amigos dejen un poco de amor"

  1. prefacio

En nuestro entorno de producción, el desarrollo ya no es un proyecto para un proyecto, sino un proyecto para cada módulo. La integración de múltiples módulos requiere el uso de una herramienta de construcción como Maven.

  1. ¿Realmente necesitamos a Maven?

¿Realmente necesitas a Maven? Creo que mis amigos pueden hacerse esta pregunta cuando estén aprendiendo Maven, ¿para qué sirve Maven? ¿Por qué necesitamos usar Maven aquí? ¿Qué problema tenemos sin Maven? La razón por la que surge esta pregunta es que incluso si no usamos Maven, aún podemos desarrollar proyectos estructurados B / S. ¿Es más problemático, como cuando viajamos? No es necesario tomar un avión, también podemos ir en tren, pero la eficiencia del tiempo es diferente.

Existen soluciones maduras desde la capa de presentación, la capa de lógica empresarial hasta la capa de persistencia y la base de datos; también podemos desarrollar proyectos sin utilizar Maven.

imagen

Puede haber un malentendido en nuestro pensamiento aquí. Maven no se utiliza directamente para ayudar a la codificación, y su posición de lucha no está en los niveles anteriores. Por lo tanto, es necesario que averigüemos qué aspectos son las deficiencias de nuestra tecnología existente a través de las necesidades reales de desarrollo empresarial.

2.2 Al final, ¿por qué usar Maven?

Maven puede ayudarnos a mejorar la eficiencia del desarrollo, pero ¿qué problemas puede ayudarnos a resolver?

①: Ayúdanos a agregar paquetes jar de terceros

         在我们今天企业的javaee开发领域中,有大量的第三方框架和工具可以供我们使用,要使用这些jar包最简单的方法就是复制粘贴到我们web工程下的WEB-INF/lib目录下。但是这会导致每次创建一个新的工程就需要将jar包重复复制到lib目录下,从而会造成我们的工作区间存在大量的重复文件,让我们的工程会显得很臃肿。

          而使用Maven后每个jar包本身值在本地创库中保存一份,需要jar包的工程只需要一坐标的方式简单的引用一下就可以了。不仅极大的节约了存储空间,让项目更加轻巧,更加避免了重复文件太多而造成的混乱。

②: Dependencia entre paquetes jar

          我们在开发工程的时候需要用的别的jar包,简而言之那别人在开发的时候也有可能需要使用到别的jar包,所以以此类推就会出现一种情况就是jar包依赖的情况。也及时我们的jar包不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,我们称之为jar包之间的依赖关系。其中比较典型的就是我们的文件上传操作,我们在使用commons-fileupload-1.3.jar 就依赖于 commons-io-2.0.1.jar,如果没有后面的包,我们的文件上传功能也就无法实现。

           那么问题来了,你知道你所使用的所有jar包依赖哪些包吗?当你拿到一个新的从未使用过jar包,你如何得知他需要那些jar包的支持?如果不了解情况的话,导入的jar包不够,那么现有的程序还是不能够正常运行。再进一步,当你的项目中需要用到上百的个jar包时,你还会人为的,手工的逐一确认他们一来的其他jar包吗?这简直就是一笔大工程。

           而引入Maven后,Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入过来,无需人工参与,节约了我们大量的时间和精力。用实际的例子来说明就是:通过Maven导入commons-fileupload-1.3.jar 后,,commons-io-2.0.1.jar 会被自动导入,程序员不必了解这个依赖关系。

           下图就是spring所需jar包的部分依赖关系

imagen

③: Obtenga un paquete jar de terceros

          在javaee的开发中需要使用jar包种类繁多,几乎每个jar包在其本身的官网上获取方式都不尽相同。为了查找一个jar包我们需要找遍互联网,身心俱疲,没有经历过的人或许体会不到这种折磨。不仅如此,费劲心力找的jar包里有的时候并没有你需要的那个类,又或许有你要的类又没有你要的方法---以不规范的方式获取的jar包往往也是不规范的。

        使用maven我们可以享受到一个完全同意规范的jar包管理体系。你只需要在你的项目已坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同下载这个jar包所依赖的其他所有jar包------规范、完整、准确、一次性解决所有问题!

PD: Aquí, por cierto, se puede decir que una especificación unificada es la creencia más alta de los programadores. Si no hay una especificación unificada, significará que cada tecnología específica tiene su propio gobierno y necesita ser agregada a nuestro proyecto de muchas formas especiales diferentes; será incompatible con otras tecnologías si finalmente se une, y será nuestro desarrollo que sufre al final. personal. La especificación uniforme en cualquier campo puede reducir en gran medida la dificultad de trabajo del programador y reducir la carga de trabajo. Por ejemplo: la interfaz USB se puede conectar a varios dispositivos. Si cada dispositivo tiene su propia interfaz única, no solo el fabricante debe mantener el diseño de cada interfaz, sino que el usuario también debe comprender la interfaz correspondiente a cada dispositivo, que es sin duda muy engorroso.

④: Divida el proyecto en varios módulos de ingeniería

     随着javaee项目的规模越来越大,开发团队的规模也与日俱增,一个项目上千人的团队持续开发很多对于javaee项目来说是再正常不过了。如果几百人上千人的开发项目是同一个web工程。那么架构师、项目经理该如何划分项目的模块、如何进行分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是java项目,有的是web项目。

     那么工程拆分后又该如何进行项目调和访问呢?这就需要用到maven的依赖管理机制。大家可以看一下survey调查项目的拆分情况。

imagen

3. Explicación principal de Maven

3.1 Introducción a maven

       Maven是Apache软件基金会组织维护的一款自动化构建工具,专注服务于java平台的项目构建和项目依赖管理。Maven这个单词的本意是:“专家,内行”。

imagen

3.2 Qué es construir

        构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从以下三个层面来看:

①: código Java puro

     小伙伴都知道,我们Java是一门编译型语言,纯Java扩展名的源文件需要编译成。class扩展名的字节码文件才能够执行。所以编写任何Java代码想要执行的话就必须编译成对应的.class文件

②: proyecto web

      当我们需要通过浏览器访问java程序时就必须将包含java程序的web工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。这个“拿”的工程我们叫部署。

     我们可以将未编译的web工程比喻成一只生的鸡,编译好的web工程是一只煮熟的鸡,编译部署的过程就是将鸡煮熟的过程。

  web工程和其编译结果的目录结构对比见下图:

imagen

③: Proyecto real

       在实际项目中整合第三方框架,web工程中除了Java程序和jsp页面、图片等静态资源之外,还包括第三方框架的jar包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。

       所以综上所述:构建就是以我们编写的java代码、框架配置文件、国家化等其他资源文件、jsp页面和图片等静态资源作为“原材料”,去“生产”一个可以运行的项目的过程。

     那么项目的构建过程包含哪些环节呢?

3.3 Varios eslabones principales del proceso de construcción

  • Limpieza: elimine los resultados de la compilación anterior y prepárese para la recompilación
  • Compilar: compile el programa fuente Java en un archivo de código de bytes ejecutable.
  • Prueba: prueba los puntos clave del proyecto para garantizar la exactitud de los puntos clave en el proceso de desarrollo iterativo del proyecto.
  • Informe: registre y muestre los resultados de la prueba en un formato estándar después de cada prueba
  • Empaquetado: empaque un proyecto que contiene muchos archivos en un archivo comprimido para su instalación o implementación. Paquete jar correspondiente al proyecto java, paquete war correspondiente al proyecto web
  • Instalación: en el entorno de Maven, se refiere específicamente a la instalación del resultado empaquetado (paquete jar o paquete war en el almacén local).
  • Implementación: implemente el resultado empaquetado en un almacén remoto o implemente el paquete war en el servidor para que se ejecute.

3.4 Construcción automatizada

De hecho, podemos encontrar las operaciones correspondientes en eclipse para los enlaces anteriores, pero no son estándar. Entonces, dado que el IDE está listo para construirse, ¿por qué deberíamos usar una herramienta de construcción como Maven? Veamos una historia corta:

  这是阳光明媚的一天,托马斯像往常一样早早的来到公司,冲好了一杯咖啡,进入自己的邮箱---很不幸,QA小姐发来了一封邮件,报告了他昨天提交的模块测试结果--有bug。“好吧,反正也不是第一次”,托马斯摇摇头,进入IDE,运行自己的程序,编译打包。部署到服务器上,然后按照邮件中的操作路径进行测试。“嗯,没错,这个地方确实有问题”,托马斯说道。于是托马斯开始尝试修复这个bug,当他差不多有眉目的时候已经到了午饭的时间。
  下午继续工作,bug很快就被修正了,接着托马斯对模块重新进行了编译,打包、部署、测试之后确认没有问题了,回复了QA小姐的邮件。
  一天就这样过去了,明媚的阳光化作了美丽的晚霞,托马斯却觉得生活并不像晚霞那样美好。

Analicemos el trabajo de Thomas este día
imagen

A partir de esto, podemos encontrar que una gran parte del tiempo de Thomas se dedica a "compilar, empaquetar, implementar y probar", estas tareas programáticas y los problemas de análisis y codificación que realmente deben realizarse con la sabiduría de "las personas "sólo cuenta una parte muy pequeña.

imagen

¿Pueden estas tareas programadas entregarse directamente a la máquina para su finalización automática? ---- ¡Por supuesto que puede! Esto es compilación automatizada

imagen

En este punto, se refleja la importancia de Maven. Se puede ejecutar automáticamente desde el comienzo del proceso de compilación hasta el final:

imagen

3.5 conceptos básicos de Maven

        Maven能够实现自动化构建是和它的内部原理分不开的,这里我们从maven的九个核心概念入手,看看Maven是如何实现自动化构建的
  • POM
  • Estructura de directorio convencional
  • coordinar
  • Gestión de la dependencia
  • Gestion de almacenes
  • Ciclo vital
  • Complementos y objetivos
  • heredar
  • polimerización

4 CÓMO

      Maven的核心程序中仅仅定义了抽象的生命周期,而具体的操作则是由Maven的插件来完成的,可是Maven的插件并不包含在Maven的核心程序中,在首次使用时需要联网下载。

5 conceptos básicos de Maven

5.1 POM

        Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型,Maven工程的核心配置,可以说是学习maven就是学习pom.xml文件中的配置。

5.2 Estructura de directorio convencional

La estructura de directorio acordada es una parte indispensable para que maven logre la compilación automatizada. Realice la compilación automatizada, maven debe poder encontrar los archivos fuente de Java antes de que se pueda compilar el siguiente paso y se debe mantener una ubicación precisa después de la compilación. archivo. Durante el desarrollo, si necesitamos que las herramientas o los marcos de terceros sepan dónde se encuentran los recursos que creamos, existen básicamente dos formas:

①: Dígalo claramente en forma de configuración

②: Acuerdo basado en herramientas o marcos de terceros

Los requisitos de Maven para la estructura del directorio del proyecto pertenecen a este último.

imagen

 现在javaee开发领域普遍认同同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的java工程进行自动化构建。

5.3 Coordenadas

①: Coordenadas en geometría

  • El uso de los vectores xey en un plano puede determinar de forma única un punto en el plano.
  • Usando x, y, z tres vectores en el espacio pueden determinar de manera única un punto en el espacio

②: coordenadas de Maven

Utilice los siguientes tres vectores para determinar de forma única un proyecto de Maven en el almacén de Maven

  • groupid: el nombre de dominio de la empresa u organización + el nombre del proyecto actual
  • artifactld: el nombre del módulo del proyecto actual
  • versión: la versión del módulo actual

imagen

③: ¿Cómo encontrar el paquete jar correspondiente en el almacén por coordenadas?

  • Conecta los tres vectores de gav

imagen

  • La cadena conectada se busca en el almacén como estructura de directorio.

imagen

5.4 Dependencia

  maven中最关键的部分,我们使用Maven最重要的就是使用他的依赖管理功能。要理解和掌握Maven的依赖管理,我们只需要解决一个  

      ①:依赖的目的是什么?

Cuando un paquete jar usa algunas clases en el paquete jar B, A tiene una dependencia de B, que es una descripción conceptual. Entonces, ¿cómo introducir un paquete jar que necesitamos de forma dependiente en el proyecto?

  答案非常简单,就是使用depenency标签指定被依赖包的坐标就可以了。

imagen

        ②:依赖的范围

Todos notaron que hay una configuración de alcance además de las coordenadas del paquete jar de destino en la información de dependencia anterior, que es el alcance de la dependencia. Hay varios valores opcionales para el rango dependiente. Lo que obtenemos es: complie, test y proporcionado.

imagen

Combinando ejemplos específicos: para helloFriend, hello es para el programa principal y junit es para el programa de prueba. Es muy obvio que el programa principal de helloFriend necesita un saludo, y el programa de prueba necesita un saludo porque necesita llamar al programa principal, por lo que la dependencia del rango de complie debe ser efectiva tanto para el programa principal como para el programa de prueba.

  • Comprender la diferencia entre cumplir y proporcionar a partir de las dos etapas diferentes de desarrollo y operación.

imagen

     ③:有效性总结

imagen

    ④:依赖的传递性

A depende de B, B depende de C, ¿puede A usar C? Entonces tenemos que ver si el alcance de C dependiente de B es compatible, de lo contrario no está disponible.

imagen

    依赖的排出

Si introducimos una dependencia de A en el proyecto actual, y A depende de B, entonces Maven introducirá automáticamente A dependiente B en el proyecto actual, pero en algunos casos, B puede ser una versión inestable o el proyecto actual tiene efectos adversos . Así es como podemos excluir B al hacer referencia a A.

  • Ejemplos de escenarios

imagen

  • Método de configuración

imagen

  • Efecto después de la exclusión

imagen

5.5 Gestión unificada de la versión del paquete jar del que depende

Es mejor usar la misma versión para un conjunto de paquetes jar del mismo marco. Para facilitar la actualización del marco, la información de la versión del paquete jar se puede extraer de manera uniforme

  • Número de versión de declaración unificada

imagen

Donde atguigu.spring.version no es una etiqueta personalizada

  • Consulte el número de versión declarado anteriormente

imagen

imagen

  • Otro uso

imagen

5.5 Almacén

①: Clasificación

    本地仓库:为当前本机电脑上的所有Maven工程服务

     远程仓库:私服:架构在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。

imagen

Almacén central: construido en Internet, que sirve a todos los proyectos de Maven en el mundo

Imagen reflejada del almacén central: instalada en todos los continentes para compartir el tráfico del almacén central. Reduzca la presión sobre el almacén central y responda a las solicitudes de los usuarios más rápido.

②: Documentos en el almacén

    maven的插件

    我们自己开发的项目的模块

    第三方框架或工具的jar包

Independientemente del paquete jar, la estructura de directorios se genera en el almacén según las coordenadas, por lo que las dependencias se pueden consultar de forma unificada.

5.6 Ciclo de vida

①: ¿Cuál es el ciclo de Maven?

  • El ciclo de vida de Maven define el orden de ejecución de cada enlace de compilación. Con esta lista, Maven puede ejecutar automáticamente los comandos de compilación.

  • Maven tiene tres ciclos de vida independientes, a saber:

      ①:clean  Lifecycle 在进行真正构建之前进行一些清理工作
    
      ②:Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等
    
      ③:site  Lifecycle 生成报告,站点,发布站点
    

Son independientes entre sí, solo puede llamar a clean para limpiar el directorio de trabajo y solo llamar al sitio para generar el sitio. Por supuesto, también puede ejecutar directamente mvn clean install site para ejecutar los tres conjuntos de ciclos.

Cada ciclo de vida consta de un conjunto de etapas, y los comandos que usualmente ingresamos en la línea de comandos siempre corresponden a una etapa específica. Por ejemplo, ejecutar mvn clean, esta limpieza es el ciclo de vida limpio, también hay una fase de limpieza.

②: ¿Qué ciclo de limpieza

  clean生命周期一共包含三个阶段:

  ①:pre-clean 执行一些需要在clean之前完成的工作

  ②:clean 移除所有上一次构建生成的文件

  ③:post-clean执行一些需要在clean之后立刻生成的工作

③: ciclo de vida del sitio

   ①:pre-site 执行一些需要在生成站点文档之前完成的工作

   ②:site 生成项目的站点文档

   ③:post-site  执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

   ④:site-deploy将生成的站点文档部署到特定的服务器上

La fase del sitio y la fase de implementación del sitio se utilizan a menudo aquí para generar y publicar sitios de Maven. Esta es una función bastante grande de Maven, que prefieren los administradores, y la generación automática de documentos y estadísticas es excelente.

④: ciclo de vida predeterminado

 Default生命周期是maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中,这里,只解释一些比较重要和常用的阶段:

validar

generar-fuentes

fuentes de proceso

generar-recursos

process-resources Copie y procese archivos de recursos en el directorio de destino, listo para empaquetar.

compilar compilar el código fuente del proyecto

clases-proceso

generar-fuentes-de-prueba

fuentes de prueba de proceso

generar-recursos-de-prueba

process-test-resources Copie y procese archivos de recursos en el directorio de prueba de destino.

test-compile compila el código fuente de prueba.

clases-de-prueba-proceso

test ejecuta pruebas utilizando un marco de prueba unitario adecuado. Estos códigos de prueba no se empaquetarán ni implementarán.

preparar-paquete

paquete Aceptar el código compilado y empaquetarlo en un formato publicable, como JAR

prueba previa a la integración

examen de integración

post-prueba-de-integración

verificar

install instala el paquete en el almacén local para que otros proyectos dependan de

implementar copia el paquete final en un almacén remoto para que otros desarrolladores puedan compartir con el proyecto o implementar en el servidor para ejecutar

⑤: Construcción de ciclo de vida y automatización

  运行任何一个阶段的时候,他前面的所有阶段都会被运行,例如我们运行mvn install的时候,代码会被编译,测试,打包。这就是Maven为什么能够自动执行构建过程的各个环节的原因。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期是至关重要。

5.7 Complementos y destinos

  • El núcleo de Maven solo define el ciclo de vida abstracto, y los complementos completan tareas específicas
  • Cada complemento puede implementar varias funciones, y cada función es un complemento
  • El ciclo de vida de Maven y los objetivos del complemento están vinculados entre sí para completar una tarea de compilación específica

Por ejemplo: compilar es un objetivo del complemento maven-compli-plugin: pre-clean es un objetivo del complemento maven-clean-plugin.

5.8 Herencia

①: ¿Por qué necesitamos un mecanismo de herencia?

Dado que la información dependiente que no cumple no se puede pasar en la "cadena de dependencia", los proyectos que la necesitan solo se pueden configurar por separado. P.ej

imagen

imagen

En este momento, si el proyecto necesita unificar la versión junit de cada módulo a 5.9, entonces la modificación manual de cada proyecto es sin duda muy indeseable. Usando el mecanismo de herencia, dicha información de dependencia se puede extraer al módulo del proyecto principal para una administración unificada.

②: Crear proyecto principal

Crear un proyecto principal es lo mismo que crear un proyecto Java general. Lo único que hay que tener en cuenta es que el método de empaquetado debe establecerse en pom al principio.

③: referencia al proyecto principal en el subproyecto

<parent>  
<!-- 父工程坐标 -->
  <groupId>...</groupId> 
  <artifactId>...</artifactId>  
  <version>...</version>  <relativePath>从当前目录到父项目的 pom.xml 文件的相对路径</relativePath> </parent>

imagen

En este momento, si el groupid y la versión del subproyecto son duplicados del proyecto principal, se pueden eliminar.

④: Gestionar dependencias en el proyecto principal

Incluya la etiqueta de dependencias en el proyecto principal con la etiqueta dependencyManagement

imagen

imagen

Vuelva a especificar las dependencias necesarias en el subproyecto, elimine el alcance y el número de versión

imagen

5.9 Agregación

①: ¿Por qué utilizar la agregación?

Después de dividir varios proyectos en módulos, debe instalarlos manualmente en el almacén uno por uno antes de que las dependencias surtan efecto. Después de modificar el código fuente, también debe realizar manualmente la operación de limpieza una por una. Después de usar la agregación, puede instalar y limpiar proyectos de Maven en lotes.

②: ¿Cómo configurar la agregación?

Utilice la combinación de moudles / etiquetas de módulo en el proyecto de agregación total y especifique la ruta relativa del proyecto del módulo.

imagen

6 Resumen

Maven es principalmente un mecanismo de gestión para la gestión de proyectos y paquetes jar. Los amigos pueden ir a http://mvnrepository.com/ para buscar la información de dependencia del paquete jar requerida .

Supongo que te gusta

Origin blog.csdn.net/qq_44762290/article/details/107504262
Recomendado
Clasificación