Maven学习笔记

Maven学习笔记

Maven

以下内容是我对菜鸟Maven教程的整理和补充

环境配置

  1. 配置Java环境
  2. 下载Maven,Maven官方下载地址,选择下载Binary zip archive
  3. 在系统环境变量中新建一条变量,变量名为MAVEN_HOME,变量值为Maven解压文件位置
  4. 在系统环境变量path中添加;MAVEN_HOME\bin;
  5. 在控制台运行mvn -v检查是否配置成功

    pom文件

    教程中POM文件中详解太多了,我们不是常用到,这里我节选了我用到的一些,填上了少量的我自己内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    <!--所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。-->
    <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.0http://maven.apache.org/maven-v4_0_0.xsd">
    <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。
    坐标包括group ID,artifact ID和 version。 -->
    <parent>
    <!--被继承的父项目的全球唯一标识符 -->
    <groupId>org.zxw</groupId>
    <!--被继承的父项目的构件标识符 -->
    <artifactId>learnmaven</artifactId>
    <!--被继承的父项目的版本 -->
    <version>1.0-SNAPSHOT</version>
    </parent>

    <!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
    <modules>
    <module>learnmavenchild</module>
    </modules>

    <!--声明项目描述符遵循哪一个POM模型版本。-->
    <modelVersion>4.0.0</modelVersion>
    <!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。
    并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->
    <!--my 建议域名后缀.公司名称 常用的域名后缀有com(商业公司) top(个人) net(网络) org(非盈利组织) edu(教育)-->
    <groupId>org.zxw</groupId>
    <!-- 构件的标识符,它和group ID一起唯一标识一个构件。
    换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;
    在某个特定的group ID下,artifact ID也必须是唯一的。
    构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。 -->
    <!--my 建议项目名称-->
    <artifactId>learnmavenchild1</artifactId>
    <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->
    <packaging>jar</packaging>
    <!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
    <version>1.0-SNAPSHOT</version>

    <!--以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件。格式是<name>value</name>。 -->
    <properties>
    <!-- my 指定java版本 -->
    <java-version>1.8</java-version>
    <!-- my 指定编码格式 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- my 自定义引用 -->
    <spring.version>5.0.9.RELEASE</spring.version>
    <mybatis.version>3.4.6</mybatis.version>
    <mybatis-spring.version>1.3.2</mybatis-spring.version>
    </properties>

    <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。 -->
    <dependencies>
    <dependency>
    <!--依赖的group ID -->
    <groupId>org.apache.maven</groupId>
    <!--依赖的artifact ID -->
    <artifactId>maven-artifact</artifactId>
    <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
    <version>3.8.1</version>
    <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
    - compile :默认范围,用于编译
    - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
    - runtime: 在执行时需要使用
    - test: 用于test任务时使用
    - system: 需要外在提供相应的元素。通过systemPath来取得
    - systemPath: 仅用于范围为system。提供相应的路径
    - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
    <scope>test</scope>
    <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。
    即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
    <exclusions>
    <exclusion>
    <artifactId>spring-core</artifactId>
    <groupId>org.springframework</groupId>
    </exclusion>
    </exclusions>
    <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。
    可选依赖阻断依赖的传递性。 -->
    <optional>true</optional>
    </dependency>
    </dependencies>

    <!--构建项目需要的信息 -->
    <build>
    <!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
    <finalName>mavenchild</finalName>
    <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
    <resources>
    <!--这个元素描述了项目相关或测试相关的所有资源路径 -->
    <resource>
    <!--描述存放资源的目录,该路径相对POM路径 -->
    <directory>${basedir}/src/main/java</directory>
    <!--包含的模式列表,例如**/*.xml. -->
    <includes>
    <include>**/*.properties</include>
    <include>**/*.xml</include>
    </includes>
    <!--排除的模式列表,例如**/*.xml -->
    <excludes/>
    </resource>
    </resources>

    <!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -->
    <testResources>
    <!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 -->
    <testResource/>
    </testResources>

    <!--使用的插件列表 -->
    <plugins>
    <!--plugin元素包含描述插件所需要的信息。 -->
    <plugin>
    <!--插件在仓库里的group ID -->
    <groupId>org.apache.maven.plugins</groupId>
    <!--插件在仓库里的artifact ID -->
    <artifactId>maven-war-plugin</artifactId>
    <!--被使用的插件的版本(或版本范围) -->
    <version>2.6</version>
    <!--作为DOM对象的配置 -->
    <configuration>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
    </plugin>
    </plugins>
    </build>

    </project>

    构建生命周期

    graph TD
     开始-->validate-->compile-->test-->package-->verify-->install-->deploy-->结束
阶段 处理 描述
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

仓库

maven仓库分为三种类型:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

    本地仓库

  • Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
  • 运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
  • 默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。
  • Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
    1
    2
    3
    4
    5
    6
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
    http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>C:/MyLocalRepository</localRepository>
    </settings>

    中央仓库

    Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

    中央仓库的关键概念:

  • 这个仓库由 Maven 社区管理
  • 不需要配置
  • 需要通过网络才能访问

    maven资源仓库,菜鸟上推荐的并不好用.

    远程仓库

    如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。
    为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。

maven依赖搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

    阿里云仓库配置

    Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库
  1. 修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    <mirrors>
    <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>
    </mirrors>
  2. pom.xml文件里添加:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <repositories>  
    <repository>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    </repository>
    </repositories>
    在我的实际开发中第二部并没有配置,也是可以正常使用的.(这里有时间再来研究)

    依赖管理

    maven依赖原则

  • 依赖最短路径优先原则
    例如:A->B->X(1.0),A->C->D->X(1.0),那么A依赖的X版本为1.0版本.
  • pom文件中申明顺序优先
    例如:A->B->X(1.0),A->C->X(2.0),路径一样长,A的pom中先申明了B,再申明了C,那么A依赖的X版本为1.0版本.
  • 覆写优先
    子pom内声明的优先于父pom中的依赖
坚持原创技术分享,您的支持将鼓励我继续创作!