我的身旁是一扇亮了又暗的窗

0%

Maven

常用 Maven 命令

执行与构建过程相关的命令,必须进入 pom.xml 所在的目录。
与构建过程相关的:编译、测试、打包…

  1. mvn clean:清理
  2. mvn compile:编译主程序
  3. mvn test-compile:编译测试程序
  4. mvn test:执行测试
  5. mvn package:打包
  6. mvn install:安装进入仓库
  7. mvn site:生成站点

联网问题

  1. Maven 的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含再 Maven 的核心程序中。
  2. 当我们执行的 Maven 命令需要用到某些插件时,Maven 核心程序首先到本地仓库中查找。
  3. 本地仓库的默认位置:[系统中当前用户的目录].m2\repository
  4. Maven 核心程序如果再本地仓库找不到需要的插件,那么它会自动链接外网,到中央仓库下载。
  5. 如果此时无法联网,则构建失败。
  6. 修改默认本地仓库的位置可以让 Maven 核心程序到我们事先准备好的目录下查找插件
    1. 找到 Maven 文件下的\conf\settings.xml
    2. 找到标签localRepository
    3. 将标签localRepository从注释中取出
    4. 定义当自定义的目录如:<localRepository>E:\maven\maven-repository</localRepository>
  7. 设置阿里 Maven 仓库
1
2
3
4
5
6
7
8
 <mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>

POM

  1. 含义:Project Object Model 项目对象模型

    DOM Document Object Model 文档对象模型
  2. pom.xml 对于 Maven 工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。重要程度相当于 web.xml 对于动态 Web 工程

坐标

Maven 的坐标

  1. groupid:公司或组织域名倒序+项目名称
  2. artifactid:模块名
  3. version:版本

仓库

  1. 仓库的分类
    1. 本地仓库:当前电脑上部署的仓库目录,当前电脑上所有 Maven 工程服务
    2. 远程仓库
      1. 私服:搭建再局域网环境中,为局域网范围内的所有 Maven 工程服务(Nexus)
      2. 中央仓库:架设再 Internet 上,为全世界所有 Maven 工程
      3. 中央仓库的镜像:为了分担中央仓库的流量,提升用户访问速度
  2. 仓库中保存的内容:Maven 工程
    1. Maven 自身所需要的插件
    2. 第三方框架或工具的 jar 包
    3. 我们自己开发的 Maven 工程

依赖

  1. Maven 解析依赖信息时会到本地仓库中查找被依赖的 jar 包
  2. 对于我们自己开发的 Maven 工程,使用 install 命令安装后就可以进入仓库
  3. 依赖的范围
    1. compile
      1. 对主程序是否有效:有效
      2. 对测试程序是否有效:有效
      3. 是否参与打包:参与
    2. test
      1. 对主程序是否有效:无效
      2. 对测试程序是否有效:有效
      3. 是否参与打包:不参与
      4. 典型例子:junit.jar
    3. provided
      1. 对主程序是否有效:有效
      2. 对测试程序是否有效:有效
      3. 是否参与打包:不参与
      4. 是否参与部署:不参与
      5. 典型例子:servlet-api.jar
  4. 依赖的传递性
    1. 在父工程依赖一次既可重复使用
    2. 注意:非 complie 范围的不能传递。所以在各个工程模块中,重复声明
  5. 依赖的排除
    1. 在不需要 j 一些 ar 包或 jar 包重复时,则要排除一部分 jar 包
    2. 排除设置
1
2
3
4
5
6
<exclusions>
<exclusion>
<gourpId>xxxx</gourpId>
<artifactId>xxxxxx</artifactId>
</exclusion>
</exclusions>
  1. 依赖原则
    1. 作用:解决模块工程之间的 jar 包冲突问题
    2. Maven 默认解决方案:路径最短者优先
    3. Maven 默认解决方案:先声明者有限(dependency 先后)
  2. 统一管理依赖的版本
    1. 使用 properties 标签使用自定义标签统一声明版本号
    2. 在需要的地方使用${自定义标签}引用声明的版本号
    3. 其实 properties 标签配合自定义标签声明数据的配置并不只能用于声明依赖的版本号,凡是需要统一声明后再引用的声明都能使用。如:字符集、声明…

生命周期

  1. 各个构建环境执行的顺序:不能打乱顺序,必须按照指定的正确顺序来执行。
  2. Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务时由插件来完成的。
  3. Maven 有三条相互独立的生命周期:
    1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
    2. Default Lifecycle 在构建核心部分,编译,测试,打包,安装,部署等等。
    3. Site Lifecycle 生成项目报告,站点,发布站点。
  4. Maven 核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不论现在执行生命周期的哪一个阶段,都是从这个生命周期最初的位置开始执行。

继承

  1. 统一管理各个模块工程中的 test 范围的依赖的版本
  2. 将 test 的依赖统一提取到父工程中,在子工程中声明的依赖时不指定版本,以工程中统一设定的为准,同时也便于修改
  3. 操作步骤
    1. 创建一个 Maven 工程为父工程。注意:打包方式为 pom

<packaging>pom</packaging>

  1. 在子工程中声明对父工程的引用
1
2
3
4
5
6
7
8
<!-- 子工程中声明父工程 -->
<parent>
<groupId>ren.guard.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前文件为基准的父工程pom.xml文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
  1. 将子工程的坐标中与父工程坐标中重复的内容删除
1
2
<groupId>ren.guard.maven</groupId><!-- 删除 -->
<version>0.0.1-SNAPSHOT</version><!-- 删除 -->
  1. 在父工程中统一管理 test 依赖
1
2
3
4
5
6
7
8
9
10
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
  1. 在子工程中删除 test 依赖的版本号部分
1
2
3
4
5
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
  1. 在配置继承后,执行安装命令时要先安装父工程

聚合

  1. 作用:一键安装各个模块工程
  2. 配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块
1
2
3
4
5
6
<modules>
<!-- 指定各个子工程的相对路径 -->
<module>jpa_settings</module>
<module>log4j_settings</module>
<module>logger_settings</module>
</modules>
  1. 使用方式:在聚合工程的 pom.xml 上点击 maven install

自动部署

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
<!-- 配置当工程构建过程中的特殊设置 -->
<build>
<!-- 项目最后的名称 -->
<finalName>mavenWeb</finalName>
<!-- 配置构建过程中需要使用的插件 -->
<plugins>
<plugin>
<!-- cargo是一家专门从事“启动Servlet容器”的组织 -->
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<!-- 针对插件进行的配置 -->
<configuration>
<!-- 配置当前系统中容器的位置 -->
<container>
<containerId>tomcat8x</containerId>
<home>D:\xxxx\xxxxx</home>
</container>
<configuration>
<type>existing</type>
<home>D:\xxxx\xxxxx</home>
<!-- 如果Tomcat端口为默认值8080则不必设置该属性 -->
<properties>
<cargo.servlet.port>8989</cargo.servlet.port>
</properties>
</configuration>
</configuration>

<!-- 配置插件在什么情况下执行 -->
<executions>
<execution>
<id>cargo-run</id>
<!-- 生命周期的阶段 -->
<phase>install</phase>
<goals>
<!-- 插件的目标 -->
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

mvn deploy

依赖信息网址

https://mvnrepository.com/