【软件架构01】Maven快速入门

Maven快速入门

对以下视频的整理:https://www.bilibili.com/video/BV1Ah411S7ZE?p=1&vd_source=d57b2df928037367dfb7f5027819b5ec

1 Maven简介(概念与作用)

1.1 Maven 是什么

本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM,Project Object Model)

一个项目就是一个对象,Maven工程结构和内容被定义在 pom.xml 中,该文件是整个Maven工作的核心

Maven使用依赖管理(Dependency)进行对项目依赖资源的管理。它和POM之间是一种双向关系,即我们的项目可以用别的资源,也可以被其它项目作为资源。依赖资源所管理的资源,主要在三个位置:

  • 本地仓库:存储在本地的一种资源仓库,本地没有去私服获取
  • 私服仓库:远程仓库,保存公共的信息,大家共享,私服没有去中央获取
  • 中央仓库:远程仓库

Maven除了能管理项目资源之外还能对项目进行构建,管理项目的整个生命周期,但需要使用一些相关的插件来完成。

image-20230227220500182

Maven的核心包含中间蓝色部分,不包含外围。虚线以上是对项目的操作过程,虚线以下Maven已经做好了所有工作,准备了无数插件。

1.2 Maven的作用

  1. 项目构建:提供标准的、跨平台的自动化项目构建方式
  2. 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  3. 统一开发结构:提供标准的、统一的项目结构(做的太好了,大家都按照这个结构来)
image-20230227221552004

2 Maven基本概念

2.1 仓库

用于存储资源,包含各种 jar 包

所有的 jar 包基本都被保存在中央仓库中(由maven管理),可以下载下来保存在本地仓库中。为解决很多人访问下载导致网络速度慢,出现了私服,比如说一个公司/部门。

image-20230228194734186
  • 仓库分类:
    • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非本机上的仓库,为本地仓库提供资源
      • 中央仓库:Maven团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
  • 私服的作用:
    • 保存具有版权的资源,包含购买或自主研发的 jar(中央仓库中的 jar 都是开源的)
    • 一定范围内共享资源,仅对内部开放
    • 访问快

2.2 坐标

什么是坐标

资源越来越多时,寻找资源就成为了一个问题。Maven中的坐标用于描述仓库中资源的位置。

Maven坐标主要组成

  1. groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
  2. artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
  3. version:定义当前项目版本号

中央仓库网址:https://mvnrepository.com/

在仓库中搜索想要的 jar ,可找到坐标,格式如下:

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

坐标的作用

使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

2.3 仓库配置

本地仓库配置

Maven启动后,会自动保存下载的资源到本地仓库

打开"D:\environment\apache-maven-3.9.0\conf\settings.xml",

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

可以发现默认位置在${user.home}/.m2/repository 中,我们在该注释外加入以下代码就可以保存到自定义的位置中:

<localRepository>D:\maven\repository</localRepository>

镜像仓库配置

还是在\conf\settings.xml 文件中,第160左右,代码如下:

  <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <!-- 配置具体的仓库下载镜像 -->
    <mirror>
      <!-- 此镜像的唯一标识符,用来区分不同的mirror元素 -->
      <id>nexus-aliyun</id>
      <!-- 对哪种仓库进行镜像,简单来说就是代替哪个仓库 -->
      <mirrorOf>central</mirrorOf>
      <!-- 镜像名称 -->
      <name>Nexus aliyun</name>
      <!-- 镜像URL -->
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

  </mirrors>

全局 setting 与用户 setting 区别

  • 全局setting定义了当前计算器中Maven的公共配置
    • 就是上述提到的\conf\settings.xml 文件
  • 用户setting定义了当前用户的配置
    • 上述提到的本地仓库配置中的repository文件夹(与该文件夹同级的setting.xml文件)

3 Maven项目基本概念

3.1 Maven工程目录结构

image-20230302162555802

要在src同层目录下创建pom.xml

一个简单的.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<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 ttp://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <!--版本-->
    <modelVersion>4.0.0</modelVersion>
    
	<!--Maven坐标:组织名称、项目名称、版本号-->
    <groupId>cn.edu.zucc</groupId>
    <artifactId>maven-basic</artifactId>
    <version>1.0</version>

    <!--项目依赖的资源-->
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>

</project>

3.2 Maven构建命令

  • mvn compile # 编译
  • mvn clean # 清理
  • mvn test # 测试
  • mvn package # 打包
  • mvn install # 安装到本地仓库

编译、测试、打包完成的东西会保存到与 src 同级的 target 文件夹中,清理就是删掉target文件夹

其中,package命令先执行了编译、测试,然后才打包;install,同样也经历了编译测试打包,然后把打包的东西放到了本地仓库(就是上面我们定义的D:\maven\repository)下的cn\eduzucc(pom.xml文件中定义的groupId)下的maven-basic(artifactId)文件夹中的1.0(version)文件夹中。

3.3 插件创建工程

Maven提供插件,可以使用模板直接创建项目

  • 创建工程

    mvn archetype:generate
    	-DgroupId={project-packaging}
    	-Dartifactid={project-name}
    	-DarchetypeArtifactId=maven-archetype-quickstart
    	-DinteractiveMode=false
    
  • 创建java工程

    mvn archetype:generate
    	-DgroupId=com.itheima 
    	-Dartifactid=java-project
    	-DarchetypeArtifactId=maven-archetype-quickstart 
    	-Dversion=0.0.1-snapshot
    	-DinteractiveMode=false
    
  • 创建web工程

    mvn archetype:generate 
    	-DgroupId=com.itheima
    	-DartifactId=web-projectDarchetypeArtifactId-maven-archetype-webapp 
    	-Dversion=0.0.1-snapshot
    	-DinteractiveMode=false
    

3.4 java和web工程目录结构的差异

image-20230302172654313

3.5 IDEA构建Maven项目

jdk设置

image-20230302210613997

Maven设置

setting中:

image-20230302210627563

project structure中:

image-20230302210754391

pom.xml解释

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <!--指定pom的模型版本-->
    <modelVersion>4.0.0</modelVersion>
    <!--打包方式:web打包为war,java打包为jar-->
    <packaging>war</packaging>

    <!--组织id-->
    <groupId>com.hhq</groupId>
    <!--项目id-->
    <artifactId>java01</artifactId>
    <!--版本号:release——完成版;snapshot——开发版-->
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--当前项目的所有依赖-->
    <dependencies>
        <!--具体的依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>

</project>

运行Demo测试

package com.hhq;

import org.apache.commons.lang3.RandomStringUtils;

public class Demo {
    public static void main(String[] args) {
        String randomValue = RandomStringUtils.randomAlphabetic(6);
        System.out.println(randomValue);
    }
}

image-20230302210917030

4 依赖管理

4.1 依赖配置

依赖指当前项目运行所需的jar,一个项目可以设置多个依赖

格式:

<!--当前项目的所有依赖-->
<dependencies>
    <!--具体的依赖-->
    <dependency>
        <!--依赖所属群组id-->
        <groupId>org.apache.commons</groupId>
        <!--依赖所属项目id-->
        <artifactId>commons-lang3</artifactId>
        <!--依赖版本号-->
        <version>3.9</version>
    </dependency>
</dependencies>

4.2 依赖传递

依赖具有传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被直接依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递遇到冲突问题的三个原则

  • 路径优先:当依赖中出现相同的资源时,就近原则(层级越深,优先级越低,层级越浅,优先级越高)
  • 声明优先:当资源在相同层级被依赖时,就早原则(配置顺序靠前的覆盖配置顺序靠后的)
  • 特殊优先:当同级配置了相同资源的不同版本,就最近原则(后配置的覆盖先配置的)
4.2.1 可选依赖

对外隐藏当前所依赖的资源——不透明

加一个 optional

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
    <!--可选依赖-->
    <optional>true</optional>
</dependency>
4.2.2 排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本一一不需要

exclusions 排除哪些,exclusion 排除哪个(不要写版本)

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
    <groupId>com.hhq</groupId>
    <artifactId>project01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>    
        </exclusion>
    </exclusions>
</dependency>
    
</dependencies>

4.3 依赖范围

依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围

作用范围:

  • 主程序范围有效(main文件夹范围内)
  • 测试程序范围有效(test文件夹范围内)
  • 是否参与打包(package指令范围内)
scope主代码测试代码打包范例
compile(默认)YYYlog4j
testYjunit
providedYYservlet-api
runtimeYjdbc

4.4 依赖范围传递性

带有依赖范围的资源在进行传递时,作用范围将受到影响

image-20230302221503462

5 生命周期与插件

5.1 构建生命周期

Maven构建生命周期描述的是一次构建过程经历经历了多少个事件

大致的过程:

image-20230302221730657

Maven对项目构建的生命周期划分为3套

  1. clean:清理工作

    • pre-clean:执行一些需要在clean之前完成的工作
    • clean:移除所有上一次构建生成的文件
    • post-clean:执行一些需要在clean之后立刻完成的工作
  2. default:核心工作,例如编译、测试、打包、部署等

    image-20230302222226157

  3. site:产生报告,发布站点等

当执行编译、测试、安装时执行的步骤如下图所示,其中,当我们指定执行到某一步骤时,也会执行从开始到指定位置

image-20230302222451961

5.2 插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能(每个小阶段都有对应的插件)
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

Maven官网插件: https://maven.apache.org/plugins/index.html

<bui1d>
    <plugins>
        <plugin>
            <!--插件坐标-->
            <groupId>org.apache .maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <!--在什么阶段执行什么插件-->
            <executions>
            	<execution>
                    <!--执行什么:在官网中都有解释-->
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <!--在什么阶段:参照上面图片,是生成测试源代码阶段-->
                    <phase>generate-test-resources</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值