Maven入门

13 篇文章 0 订阅
8 篇文章 0 订阅

Maven笔记

应用场景:

  • 开发过程: 管理jar

  • 自动部署
    Maven%E7%AC%94%E8%AE%B0.assets/image-20220517215432237-20220518222421111.png

  • 私有仓库

一.概要

  • maven是一个依赖管理工具
  • maven是一个构建管理工具

1. Maven是一个依赖管理工具

  • jar包的规模

    随着我们使用越来越多的框架,或者框架封装成都越来越高,项目中使用的jar包也越来越多.项目中,一个模块里面用到三百个jar包是非常正常的

  • jar包的来源

    1. 这个jar包所属的技术的官网.
    2. https://mvnrepository.com/
  • jar包之间的依赖关系

    框架中使用的jar包,不仅数量庞大,并且彼此之间存在错综复杂的依赖关系.依赖关系的复杂程度,已经上升到了完全不能靠人力手动解决的程度,另外jar包之间有可能产生冲突.进一步增加了我们在jar包使用过程中的难度.

2. Maven作为构建管理工具
  • 在IDE环境下项目的构建是由IDE利用了maven来帮助完成的
  • 脱离IDE的情况下
    Maven%E7%AC%94%E8%AE%B0.assets/image-20220518222224873.png
3. 结论
  • 管理规模庞大的jar包的专门工具
  • 脱离IDE环境自信构建操作的专门工具

二. Maven是什么?

1. 构建

构建过程包含的主要环节:

  • 清理: 删除上次构建的结果,为了下一次构建做好准备
  • 编译: Java源程序编译成*.class字节码文件
  • 测试: 运行提前准备好的测试程序
  • 报告: 针对刚才测试的结果生成一个全面的信息
  • 打包:
    • Java工程: jar包
    • web工程: war包
  • 安装: 把一个Maven工程经过打包操作生成的jar包或war包安装到Maven仓库
  • 部署: 将准备好的jar包或war包部署到服务器上运行
    • 部署jar包: 吧一个jar包部署到Nexus私服服务器上
    • 部署war包: 借助相关Maven插件(例如cargo),将war包部署到Tomcat服务器上

2. 依赖

如果A工程里面用到B工程的类.接口.配置文件等资源,就需要A依赖B

依赖管理中要解决的问题

  • jar包的下载: 使用Maven之后,jar包会从规范的远程仓库下载到本地
  • jar包之间的依赖: 通过依赖的传递行自动完成
  • jar包之间的冲突: 通过对依赖的配置进行调整,让某些jar包不会被导入

3. Maven的工作机制

Maven%E7%AC%94%E8%AE%B0.assets/image-20220519225647441.png

三. Maven核心程序解压与配置

1. Maven官网地址

官网地址

下载地址 -》 需要自己根据需要版本进行选择

2. 指定本地仓库

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
 
<localRepository>/Users/zangzihe/Desktop/study/maven/repository</localRepository>

注意⚠️: 本地仓库本身也需要一个非中文没有空格的路径,

3. 配置阿里云提供的镜像仓库

Maven下载jar包默认访问境外的中央仓库,而国内外网站速度很慢.所以改成阿里云的镜像仓库,可以让Mavne下载jar包的时候速度更快.配置的方式是: 将下面mirror标签争气复制到settings.xml文件的标签内部

 <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
 </mirror>

4. 配置Maven工程的基础JDK版本

如果按照默认配置运行,Java工程使用的默认JDK版本是1.5, 而我们熟悉喝常用的JDK1.8版本. 修改配置的方式是将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内, 后续也可能直接在pom中进行配置

<profile>
	  <id>jdk-1.8</id>
	  <activation>
		<activeByDefault>true</activeByDefault>
		<jdk>1.8</jdk>
	  </activation>
	  <properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
	  </properties>
</profile>

5. 配置环境(首先需要Java环境)

根据需求自行进行配置,暂不赘述

  • tip

    配置环境变量的规律:

    XXX_HOME通常指向的是bin目录的上一级

    PATH指向的是bin目录

四. 构建Maven项目以及解读POM和Maven基础命令

1. Maven坐标:

1) 坐标和仓库中jar包的储存路径之间的对应关系

使用三个「向量」在「Maven的仓库」中唯一的定位到一个jar包

  • groupId: 公司或组织的ID -> 公司或组织的域名倒序通常会加上项目名称

    例如: com.azang.maven

  • artifactId: 一个项目或者是项目中的一个模块的ID -> 将来作为Maven工程的工程名

  • version: 版本号 -> 模块的版本好根据自己的需要设定

    例如: SNAPSHOT表示快照版本, 正在迭代过程, 不稳定的版本

    例如: RELEASE表示正式版本

2) 坐标和仓库中jar包的储存路径之间的对应关系
  • 坐标

    <groupId>top.azang.aries</groupId>
    <artifactId>azang-aries</artifactId>
    <version>1.0</version>
    
  • 上面坐标对应的jar包在Maven本地仓库中的位置:

    Maven本地仓库目录\top\azang\aries\azang-aries\1.0\azang-aries-1.0.jar
    
  • 一定要学会根据坐标找到本地仓库中的jar包

2. 使用命令生成Maven工程(mvn archetype:generate)

mvn : 主命令

archetype:generate : 子命令

archetype : 插件

generate : 目标

  • 测试

    root@azang405:~#  mvn archetype:generate
    [INFO] Scanning for projects...
    Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-antrun-plugin/1.3/maven-antrun-plugin-1.3.pom
    .....
    此处省略n行下载
    .....
    Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom
    Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-dependency-plugin/2.8/maven-dependency-plugin-2.8.pom (11 kB at 25 kB/s)
    
    Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-archetype-plugin/3.2.1/maven-archetype-plugin-3.2.1.jar (101 kB at 179 kB/s)
    [INFO]
    [INFO] ------------------< org.apache.maven:standalone-pom >-------------------
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] --------------------------------[ pom ]---------------------------------
    [INFO]
    [INFO] >>> maven-archetype-plugin:3.2.1:generate (default-cli) > generate-sources @ standalone-pom >>>
    [INFO]
    [INFO] <<< maven-archetype-plugin:3.2.1:generate (default-cli) < generate-sources @ standalone-pom <<<
    [INFO]
    [INFO]
    [INFO] --- maven-archetype-plugin:3.2.1:generate (default-cli) @ standalone-pom ---
    Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetype/archetype-catalog/3.2.1/archetype-catalog-3.2.1.pom
    .....
    此处省略n行下载
    .....
    Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/ant/ant/1.8.1/ant-1.8.1.jar (1.5 MB at 192 kB/s)
    [INFO] Generating project in Interactive mode
    [WARNING] No archetype found in remote catalog. Defaulting to internal catalog
    [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
    Choose archetype:
    1: internal -> org.apache.maven.archetypes:maven-archetype-archetype (An archetype which contains a sample archetype.)
    2: internal -> org.apache.maven.archetypes:maven-archetype-j2ee-simple (An archetype which contains a simplifed sample J2EE application.)
    3: internal -> org.apache.maven.archetypes:maven-archetype-plugin (An archetype which contains a sample Maven plugin.)
    4: internal -> org.apache.maven.archetypes:maven-archetype-plugin-site (An archetype which contains a sample Maven plugin site.
          This archetype can be layered upon an existing Maven plugin project.)
    5: internal -> org.apache.maven.archetypes:maven-archetype-portlet (An archetype which contains a sample JSR-268 Portlet.)
    6: internal -> org.apache.maven.archetypes:maven-archetype-profiles ()
    7: internal -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
    8: internal -> org.apache.maven.archetypes:maven-archetype-site (An archetype which contains a sample Maven site which demonstrates
          some of the supported document types like APT, XDoc, and FML and demonstrates how
          to i18n your site. This archetype can be layered upon an existing Maven project.)
    9: internal -> org.apache.maven.archetypes:maven-archetype-site-simple (An archetype which contains a sample Maven site.)
    10: internal -> org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)
    # 选择一个archetype默认是7,7对应的是maven-archetype-quickstart,这里我们实验选择7,如有需求请根据情况进行更改 --> 回车
    Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:
    
    Downloading from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.pom
    .....
    此处省略n行下载
    .....
    Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar (6.2 kB at 18 kB/s)
    # 填写参数根据需要,如果version和package不写就是默认冒号之前的
    Define value for property 'groupId'Define value for property 'groupId': top.azang.aries
    Define value for property 'artifactId': azang-aries
    Define value for property 'version' 1.0-SNAPSHOT: : 1.0
    Define value for property 'package' top.azang.aries: :
    Confirm properties configuration:
    groupId: top.azang.aries
    artifactId: azang-aries
    version: 1.0
    package: top.azang.aries
    # 检查参数没有问题直接回车
     Y: :
    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: basedir, Value: /Users/zangzihe/Desktop/GitHub/test
    [INFO] Parameter: package, Value: top.azang.aries
    [INFO] Parameter: groupId, Value: top.azang.aries
    [INFO] Parameter: artifactId, Value: azang-aries
    [INFO] Parameter: packageName, Value: top.azang.aries
    [INFO] Parameter: version, Value: 1.0
    #创建工程的目录
    [INFO] project created from Old (1.x) Archetype in dir: /Users/azang/Desktop/GitHub/test/azang-aries
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  23:37 min
    [INFO] Finished at: 2022-06-05T22:16:17+08:00
    [INFO] ------------------------------------------------------------------------
    
    # 构建成功 BUILD SUCCESS
    

3. Maven核心概念: POM

1⃣️.含义
  • POM: Project Object Model, 项目对象模型. 和POM类似的事: DOM(Document Object Model), 文档对象模型. 他们都是模型化思想的具体实现
2⃣️. 模型化思想
  • POM小时将工程抽象为一个模型, 在用程序中的对象来描述这个模型. 这样我们就可以用程序来管理项目了. 我们在开发过程中, 最基本的做法就是将现实生活中的事物抽象为模型, 然后封装模型相关的数据作为一个对象, 这样就可以在程序中计算与现实事物相关的数据
3⃣️. 对应的配置文件
  • POM理念集中体现在Maven工程根目录下pom.xml这个配置文件中. 所以这个pom.xml配置文件就是Maven工程的核心配置文件. 其实学习Maven就是学这个文件怎么配置, 各个配置有什么用
4⃣️.解读 pom.xml
  • <!-- project 标签: 根标签, 表示对当前工程进行配置、管理 -->
    <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 标签: 从Maven2开始就固定时4.0.0 -->
      <!-- 代表当前pom.xml所采用的标签结构 -->
      <modelVersion>4.0.0</modelVersion>
    
      <!-- 坐标信息 -->
      <!-- groupId 坐标: 坐标向量之一: 代表公司或组织开发的某一个项目 -->
      <groupId>top.azang.aries</groupId>
      <!-- artifactId 坐标: 坐标向量之一: 代表项目下的一个模块 -->
      <artifactId>azang-aries</artifactId>
      <!-- version 坐标: 坐标向量之一: 代表当前模块的版本 -->
      <version>1.0</version>
      <!-- packaging 标签: 打包方式 -->
      <!-- 取指jar: 生成jar包, 说明这是一个Java工程  -->
      <!-- 取指war: 生成war包, 说明这是一个web工程  -->
      <!-- 取指pom, 说明这个工程是用来管理其他工程的工程  -->
      <packaging>jar</packaging>
    
      <name>azang-aries</name>
      <url>http://maven.apache.org</url>
    
      <!-- properties 标签: 在maven中定义属性值 -->
      <properties>
        <!-- project.build.sourceEncoding 标签: 在构建过程中读取源码时使用的字符集 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
      <!-- dependencies 标签: 配置具体依赖信息 -->
      <dependencies>
        <!-- dependency 标签: 配置一个具体的依赖信息 -->
        <dependency>
          <!-- 坐标信息: 导入哪个jar包, 就配置他的坐标信息即可 -->
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <!-- scope 标签: 配置当前依赖的范围 -->
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    

4. Maven核心概念: 约定的目录结构

  • 各个目录的意义

    • src: 源码目录
    • src/main: 主体程序目录
    • src/main/java: Java源代码
    • src/main/java/com: package目录
    • src/main/resources: 配置文件
    • src/test: 测试程序目录
    • src/test/java: Java源代码
    • src/test/java/com: package目录
    • 另外还有一个target目录专门存放构建操作输出的结果
      请添加图片描述
  • 约定目录结构的意义

    Maven为了让构建过程能够尽可能自动化完成, 所以必须约定目录结构的作用. 例如: Maven执行编译操作, 必须先去Java源程序目录读取Java源码, 然后进行编译, 最后吧编译结果存放在target目录

  • 约定大于配置

    Maven对于目录结构问题, 没有采用配置的方式, 而是基于约定. 这样会让我们在开发过程中非常方便. ----》 目前开发领域的技术发展趋势就是: 约定大于配置, 配置大于编码

5. Maven命令

要求: 运行Maven中和构建操作相关的命令时, 必须进入到pom.xml所在的目录. 如果没有在pom.xml所在的目录运行Maven的构建命令, 那么会看到下面的错误信息

The goal you specified requires a project to execute but there is no POM in this directory

  1. 清理操作

    # 效果: 删除target目录
    mvn clean 
    
  2. 编译操作

    # 主程序编译: --》 主体程序编译存放结果目录: target/classes
    mvn compile
    
    # 测试程序编译: --》 测试程序编译存放结果目录: target/test-classes
    mvn test-compile
    
  3. 测试操作

    # 测试的报告存放的目录 target/surfire-reoports
    # 具体情况查看日志可以根据断言来判断测试结果 (现在基本都使用ide来做debug暂时遇到使用的情况较少)
    mvn test
    
  4. 打包操作

    • 命令

      # 打包结果--jar包, 存放在target目录
      mvn package
      
    • 日志

      .....省略上半部分
      [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ azang-aries ---
      # 这里可以看出我们build的jar包的名字是由artifactId-version标签内容连起来命名的
      [INFO] Building jar: /Users/zangzihe/Desktop/GitHub/test/azang-aries/target/azang-aries-1.0.jar
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      .....省略后半部分
      
  5. 安装操作: 只有install了才会存放到本地仓库中去

    • 命令

      # 安装的效果时将本地构建过程中生成的jar包存入Maven本地仓库. 这个jar包在Maven仓库中的路径是根据它的坐标生成的
      mvn install
      
    • 寻找文件的方法

      寻找install在本地库中的jar包的方法–》可以看出文件的具体路径是和pom或着setting中的配置相关的

      # 例如我们的pom文件中的配置是如下
      <groupId>top.azang.aries</groupId>
      <artifactId>azang-aries</artifactId>
      <version>1.0</version>
      <packaging>jar</packaging>
      
      # log
      # 其中--->${maven-repository}表示您配置的maven本地仓库位置
      ...
      [INFO] Installing /Users/zangzihe/Desktop/GitHub/test/azang-aries/target/azang-aries-1.0.jar to ${maven-repository}/top/azang/aries/azang-aries/1.0/azang-aries-1.0.jar
      # 下方表示着原本的项目的pom文件替换成了本地仓库中的pom文件
      [INFO] Installing /Users/zangzihe/Desktop/GitHub/test/azang-aries/pom.xml to ${maven-repository}/top/azang/aries/azang-aries/1.0/azang-aries-1.0.pom
      [INFO] ------------------------------------------------------------------------
      ...
      

6. 依赖的范围

  1. 依赖范围

    • 标签位置: 下 下
    • 标签的可选值: compile/test/provided/system/runtime/import

    1⃣️. complie和test(测试)对比

    main目录(空间)test目录(空间)开发过程(时间)使用编译器开发的时候部署到服务器(时间)打包成jar或者war运行时-》是否参与打包
    compile有效有效有效有效
    test无效有效有效无 效

    2⃣️. complie和provided(已提供)对比

    main目录(空间)test目录(空间)开发过程(时间)使用编译器开发的时候部署到服务器(时间)打包成jar或者war运行时-》是否参与打包
    compile有效有效有效有效
    provided有效有效有效无效
  2. 结论

    • compile: 通常使用的第三方框架的jar包这样在项目实际运行时真正要用到的jar包都是以compile范围进行依赖的. 比如SSm框架所需要的jar包
    • test: 测试过程中使用的jar包, 以test范围依赖进来. 比如junit
    • provided: 在开发过程中需要用到的“服务器上的jar包”通常是以provided范围依赖进来. 比如servlet-api, jsp-api这些在使用war包的时候tomcat的lib文件夹中都是自带的所以线上不需要. 而这个范围的jar包之所以不参与部署, 不放进war包, 就是避免和服务器上已有的同类jar包产生冲突, 同时减轻服务器的负担. 说白了就是: “服务器上已经有了,你就别带了,带了多余很麻烦

7. 依赖的传递性

可以根据依赖的传递性以及mvn dependency:tree和mvn dependency:list命令来去查看依赖是否已经传递从而去判断依赖所导致的一些问题

  1. 概念

    A依赖B, B依赖C, 那么在A没有配置对C的依赖的情况下, A里面能不能直接使用C?

  2. 传递原则

    在A依赖B, B依赖C的前提下, C是否能够传递到A, 取决于B依赖C时使用的依赖范围

    • B依赖C时使用compile范围: 可以传递
    • B依赖C时使用test或provided范围: 不能传递, 所以需要这样的jar包时, 就必须在需要的地方明确配置依赖才可以
  3. 使用命令查看可以使用的依赖

    # 查看maven项目依赖树形结构
    mvn dependency:tree
    
    # 日志
    [INFO] --------------------< top.azang.aries:azang-aries >---------------------
    [INFO] Building azang-aries 1.0
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ azang-aries ---
    [INFO] top.azang.aries:azang-aries:jar:1.0
    [INFO] \- junit:junit:jar:3.8.1:test
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.660 s
    [INFO] Finished at: 2022-07-08T16:07:12+08:00
    [INFO] ------------------------------------------------------------------------ 
    
    # 查看mavne项目可用依赖列表
    mvn dependency:list
    
    # 日志
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] --------------------< top.azang.aries:azang-aries >---------------------
    [INFO] Building azang-aries 1.0
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ azang-aries ---
    [INFO] 
    [INFO] The following files have been resolved:
    [INFO]    junit:junit:jar:3.8.1:test
    [INFO] 
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.729 s
    [INFO] Finished at: 2022-07-08T16:47:18+08:00
    [INFO] ------------------------------------------------------------------------
    

8. 依赖的排除

  1. 概念

    当A依赖B, B依赖C而且C可以传递到A的时, A不想要C, 需要在A里面把C排除掉. 而往往这种心旷都是为了避免jar包之间的冲突

    image-20220708190922558

    所以配置依赖的排除其实就是组织某些jar包的传递. 因为这样的jar包传递过来会和其他jar包冲突.

  2. 配置方式标签

    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-boot-starter</artifactId>
      <version>3.0.0</version>
    	<!-- 使用excludes标签配置依赖的排除 -->
      <exclusions>
        <!-- 在exclude标签中配置一个具体的排除-->
        <exclusion>
          <!-- 指定要排除的依赖的坐标(不需要写version)-->
          <groupId>io.swagger</groupId>
          <artifactId>swagger-models</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

9. 继承

  1. 概念

    Maven工程之间, A工程继承B工程

    • B工程: 父工程
    • A工程: 只工程

    本质上是A工程的pom.xml中配置继承了B工程中pom.xml的配置

  2. 作用

    • 在父工程中统一管理项目中的依赖信息, 具体来说是管理依赖信息的版本
    • 他的背景是:
      • 对一个比较大型的项目进行了模块拆分
      • 一个project下面, 创建了很多歌module
      • 每一个module都需要配置自己的依赖信息
    • 他背后的需求是:
      • 在每一个module中各自维护各自的依赖信息很容易发生出入, 不易统一管理
      • 使用同一个框架内不同的jar包, 他们应该是同一个版本, 所以整个项目中使用的框架版本需要统一
      • 使用框架式所需要的jar包组合(或者说依赖信息组合)需要经过长期摸索和反复调试, 最终确定一个可用组合. 这个耗费很大精力总结出来的方案不应该在新的项目中重新搜索
    • 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范, 准确的jar包; 又能够将以往的经验沉淀下来, 节约时间和精力
  3. 操作

    • 创建父工程

      创建的过程和前面创建Maven项目的方式一样

      工程名字: test-maven-parent

      工程创建好之后, 要修改他的打包方式

      <groupId>com.azang</groupId>
      <artifactId>test-maven-parent</artifactId>
      <version>1.0-SNAPSHOT</version>
      <!-- 当前工程作为父工程, 他要去管理子工程, 所以打包方式必须是pom-->
      <packaging>pom</packaging>
      

      因为只有打包方式为pom的Maven工程能够管理其他Maven工程. 打包方式为pom的Maven工程中规定是不写业务代码的, 他是专门用来管理其他Maven工程的工程

    • 创建模块工程

      创建好子工程之后检查子工程pom和父工程pom的关系

      • 子工程[pom.xml]

        <parent>
          <artifactId>test-maven-parent</artifactId>
          <groupId>com.azang</groupId>
          <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        
        <!-- 子工程groupId如果和父工程groupId相同的话可以省略 -->
        <!-- 子工程version也是可以省略的,理论上version是相同的 -->
        <!-- 省略了groupId和version之后子工程的坐标可以只保留artifactId -->
        <artifactId>test-maven-son</artifactId>
        <name>test-maven-son</name>
        
      • 父工程[pom.xml]

        <groupId>com.azang</groupId>
        <artifactId>test-maven-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        
        <name>test-maven-parent</name>
        <url>http://maven.apache.org</url>
        
        <!-- 聚合配置 -->
        <modules>
          <module>test-maven-son</module>
        </modules>
        
      • 在父工程管理子工程依赖

        <properties>
          <!-- 创建我们自定义的属性标签 -->
          <!-- 标签名: 属性名 -->
          <!-- 标签值: 属性值 -->
          <!-- 应用方式: ${标签名} -->
          <aries.version>1.0</aries.version>
          <!-- 通过引用属性表达式设定版本号, 这样版本号就成了一个动态值 -->
          <!-- 通过属性名解析后才知道具体是什么值 -->
          <spring-boot.version>2.5.8</spring-boot.version>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <java.version>1.17</java.version>
          <mybatis-plus.version>3.5.1</mybatis-plus.version>
        </properties>
        
        <!-- 在父工程中统一管理依赖信息-->
        <!-- 注意⚠️: 即使在父工程配置了对依赖的管理, 子工程需要使用具体哪一个依赖还是要明确配置 -->
        <dependencyManagement>
          <dependencies>
        
            <!-- 即使在父工程配置了对依赖的管理, 子工程需要使用具体哪一个依赖还是要明确配置  -->
            <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-dependencies</artifactId>
              <!-- 对于已经在父工程进行了管理的依赖, 子工程中引用时可以不写version -->
              <!-- 情况1确实省略了version标签: 子工程才拿的就是父工程管理的版本 -->
              <!-- 情况2没有省略version标签:
                A: 子工程配置的version和父工程管理的版本一致, 那么最终还是采纳父工程管理的版本
                B: 子工程配置的version和父工程父案例的版本不一致, 那么子工程配置的版本会覆盖父工程管理的版本. 绝大部份情况下子工程还是遵循父工程统一管理的版本 -->
              <version>${spring-boot.version}</version>
              <type>pom</type>
              <scope>import</scope>
            </dependency>
        
            <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid-spring-boot-starter</artifactId>
              <version>${druid.version}</version>
            </dependency>
        
            <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <version>${mybatis-plus.version}</version>
            </dependency>
        
          </dependencies>
        </dependencyManagement>
        
  4. 实际意义

    image-20220710011602514

    编写一套符合要求, 开发各种功能都能正常工作的依赖组合并不容易. 如果公司里已经有人总结了成熟的组合方案, 那么在开发新项目时, 如果不使用原有的积累, 而是重新摸索, 会浪费大量的时间. 为了提升效率, 我们可以使用工程继承的机制, 让成熟的依赖组合方案能够保留下来.

    如上图所示, 公司级的父工程中管理的就是成熟的依赖组合方案, 各个新项目, 子系统各求所需即可

10. 聚合

  1. 聚合本身的意义

    • 部份组成整体
  2. Maven中的聚合

    • 使用一个“总工程”将各个“模块工程”汇集起来, 作为一个整体对应完整的项目
      • 项目: 整体
      • 模块: 部份
    • 概念的对应关系
      • 从继承的关系角度看:
        • 父工程
        • 子工程
      • 从聚合关系角度来看:
        • 总工程
        • 模块工程
  3. 好处

    • 一键执行Maven命令: 很多构建命令都可以在“总工程”中一件执行

      以mvn install命令为例: Maven要求有父工程时先安装父工程; 有依赖的工程时, 先安装被依赖的工程. 我们自己考虑这些规则会很麻烦. 但是工程聚合之后, 在总工程自信mvn install可以一件完成安装, 而且会自动按照正常的顺序执行

    • 配置聚合之后, 各个模块工程会在总工程中展示一个列表, 让项目中的各个模块一目了然

  4. 聚合配置

    在父工程中在models标签中配置子工程model标签即可具体可见上文效仿

  5. 依赖循环问题

    • 如果A工程依赖B工程, B工程依赖C工程, C工程又翻过来依赖A工程, 那么执行构建操作时会报下面的错误

      [ERROR] [ERROR] The projects in the reactor contain a cyclic reference

      这个错误的含义就是: 造成了循环依赖

五. 其他核心概念

1⃣️ 生命周期

  1. 作用

    • 为了让构建过程自动化完成, Maven设定了三个生命周期, 生命周期中俄米一个环节对应构建过程中的一个操作
  2. 三个生命周期

    生命周期作用各个环节
    Clean清理操作相关pre-clean
    clean
    post-clean
    Site生成站点相关(将整个工程看作一个项目,将所有的项目介绍, 开发人员, 依赖, 生成一个简要说明的静态页面展示不做介绍)pre-site
    site
    post-site
    deplov-site
    Default主要的构建过程validate 检查maven工程最基本的语法是否正确
    generate-source
    process-source 处理源码
    generate-resource
    process-resource 复制并处理资源文件, 至目标目录, 准备打包
    complie 编译项目main目录下 的源代码
    process-classes
    generate-test-sources
    process-test-sources
    generate-test-resource
    process-test-resources 复制并处理资源文件, 至目标测试目录
    test-complie 编译测试源代码
    process-test-classes
    test 使用适合的单元测试框架运行测试, 这些测试代码不会被打包或部署
    prepare-package
    package 接受编译好的代码, 打包成可发布的格式, 如jar
    pre-integration-test
    integration-test
    post-integration-test
    verify
    install 将包安装到本地仓库, 以让其他项目依赖
    deploy 将最终的包覆之道远程仓库, 依然其他开发人员共享, 或者部署到服务器上运行

2⃣️ 插件和目标

  1. 插件
    • Mavne的核心程序仅仅负责宏观调度, 不走具体工作. 具体工作都是有Maven插件完成的. 例如: 编译就是由maven-compiler-plugin-3.1.jar插件完成的
  2. 目标: 就是插件 的功能
    • 一个插件可以对应对歌目标, 而每一个目标和生命周期中的某一个环节对应
    • Default生命周期中有compile和test-compile两个和编译相关的环节, 这两个环节对应compile和test-compile两个目标, 而这两个目标都是有maven-compiler-plugin-3.1.jar插件来执行的

3⃣️ 仓库

  • 本地仓库: 在当前电脑上, 为电脑上所有工程服务
  • 远程仓库: 需要联网
    • 局域网: 我们自己搭建的Maven私服, 例如使用Nexus技术.
    • Internet
      • 中央仓库
      • 镜像仓库: 内容和中央仓库保持一致, 但是能够分担中央仓库的负载, 同时让用户能够就近访问提高下载速度, 例如: Nexus aliyun
  • ⚠️ 建议不要中央仓库和阿里云景象混用, 否则jar包来源不纯, 彼此冲突
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

社畜阿藏405

挣点钱不丢人吧?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值