Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Java自动化构建工具——Maven

2021/12/30 Java
Word count: 1,941 | Reading time: 8min

Java自动化构建工具——Maven

目前的技术在开发中存在的问题、Maven作用

①一个项目就是一个工程

  • 如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。

△借助于Maven就可以将一个项目拆分成多个工程。

②项目中需要的jar包必须手动“复制”、“粘贴”到WEB-INF/lib目录下

  • 带来的问题是:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。

△借助Maven,可以将jar包仅仅保存在“仓库”中,有需要使用的工程“引用”这个文件接口,并不需要真的把jar包复制过来。

③jar包需要别人替我们准备好,或到官网下载

  • 不同技术的官网提供jar包下载的形式是五花八门的。
    有些技术的官网就是通过Maven或SVN等专门的工具来提供下载的。
    如果是以不规范的方式下载的jar包,那么其中的内容很可能也是不规范的。

△借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了Maven的中央仓库中。
以规范的方式下载的jar包,内容也是可靠的。

④一个jar包依赖的其他jar包需要自己手动加入到项目中

  • FileUpload组件→IO组件。commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar。如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。

△Maven会自动将被依赖的jar包导入进来。

Maven是什么[What]

①Maven是一款服务于Java平台的自动化构建工具。
Make→Ant→Maven→Gradle妹文、麦文
②构建
[1]概念:以"ava源文件”、“框架配置文件”、"JSP”、“HTML”、“图片”等资源为“原材料”,去“生产”一个可以运行的项目的过程。

  • 编译
  • 部署
  • 搭建

[2]编译:Java源文件[User.java]→编译→Class字节码文件[User.class]→交给JVM去执行
[3]部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程“编译的结果"
生的鸡→处理一熟的鸡
动态Web工程→编译、部署→编译结果

构建过程中的各个环节

[1]清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
[2]编译:将Java源程序编程成class字节码文件
[3]测试:自动测试,自动调用junit程序
[4]报告:测试程序执行的结果
[5]打包:动态Web工程打war包,Java工程打jar包
[6]安装:Maven特定的概念——将打包得到的文件复制到“仓库”中的指定位置
[7]部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行

常用Maven命令

①注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。
与构建过程相关:编译、测试、打包、……
②常用命令
[1]mvn clean:清理
[2]mvn compile:编译主程序
[3]mvn test-compile:编译测试程序
[4]mvn test:执行测试
[5]mvn package:打包

联网问题

①Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
②当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
③本地仓库的默认位置:[系统中当前用户的家目录]/.m2/repository 如C:/Users/[登录当前系统的用户名]/.m2/repository
④Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
⑤如果此时无法连接外网,则构建失败。
⑥修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
[1]找到Maven解压目录/conf/settings.xml
[2]在settings.xml文件中找到localRepository标签
[3]将<localRepository>/path/to/local/repo</localRepository>从注释中取出E:/apache-maven-3.6.2/MavenRepo
[4]将标签体内容修改为已经准备好的Maven仓库目录

补充:

换镜像,可以在settings.xml的第153行左右,设置阿里云镜像

1
2
3
4
5
6
<mirror>
<id>aliyun</id>
<mirrorOf>*</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

介绍Maven的视频

宏变量

工程版本号

1
2
3
4
5
<dependency>
<groupId>top.nymrli.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>

属性_版本号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <!--统一管理jar包和版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>8.0.18</mysql.version>
<druid.verison>1.1.16</druid.verison>
<mybatis.spring.boot.verison>1.3.0</mybatis.spring.boot.verison>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 需要注意的是 ${xxxx}大括号中不支持空格--!>

maven的传递、冲突、聚合

依赖传递

有三个项目:ABC

1
2
3
4
5
A
|
B
|
C
B是依赖A的,C又是依赖B的,所以依赖传递,C也是依赖A的
A B 项目打成jar包到本地仓库中:
clean package(打成jar包) => install(jar包安装到本地仓库)
clean compile(编译)

pom.xml文件中的依赖配置

1
2
3
4
5
6
7
8
9
10
11
12
13
B是依赖A的,在B的pom.xml文件中写入A的坐标
<dependency>
<groupId>com.A</groupId>
<artifactId>A-model</artifactId>
<version>0.0.1-SNAPSNOTL</version>
</dependency>
------------------------------------
C是依赖B的,在C的pom.xml文件中写入B的坐标
<dependency>
<groupId>com.B</groupId>
<artifactId>B-model</artifactId>
<version>0.0.1-SNAPSNOTL</version>
</dependency>

A、B、C项目各自打包、编译,在C的项目的Maven dependencies引入中不仅会引入B,而且还会引入A项目,这就是依赖的传递。

如果项目C只想依赖B,不想依赖A怎么办? 排除依赖:exclusions

1
2
3
4
5
6
7
8

<exclusions>
<exclusion>
<groupId>com.A</groupId>
<artifactId>A-model</artifactId>
<version>0.0.1-SNAPSNOTL</version>
<exclusion>
<exclusions>

这样在C项目编译后compile,就排出对A的依赖

Maven依赖冲突

  • 原则1:短路优先,如果A需要导入一个依赖X,在路径中选择最短的。
  • 原则2:在路径相同时,先声明先优先。如果A需要导入一个依赖X,1、2路线相同,在A中的pom.xml先声明B(C),就引入B(C)的X(jar)。
1
2
3
4
5
6
7
在传递依赖的原则下,A->B->C->X(jar) 路线1
A->D->X(jar) 路线2
--原则1:短路优先,如果A需要导入一个依赖X,在路径中选择最短的。

在传递依赖的原则下,A->B->X(jar) 路线1
A->C->X(jar) 路线2
--原则2:在路径相同时,先声明先优先。如果A需要导入一个依赖X,1、2路线相同,在A中的pom.xml先声明B(C),就引入B(C)的X(jar)。

Maven项目的聚合

在D项目中聚合 ABC三个项目,D的pom.xml文件如下所示

1
2
3
4
5
6
7
8
9
10

1. 指定package格式
<package>pom</package>
...
2. 设定子模块名
<modules>
<module>../模块名</module>
<module>../模块名</module>
<module>../模块名</module>
</moules>

Author: Mrli

Link: https://nymrli.top/2019/09/13/Java自动化构建工具——Maven/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
软件测试大赛
NextPost >
打jar包和使用jar包
CATALOG
  1. 1. Java自动化构建工具——Maven
    1. 1.1. 目前的技术在开发中存在的问题、Maven作用
    2. 1.2. Maven是什么[What]
    3. 1.3. 构建过程中的各个环节
    4. 1.4. 常用Maven命令
    5. 1.5. 联网问题
      1. 1.5.1. 补充:
    6. 1.6. 宏变量
    7. 1.7. maven的传递、冲突、聚合
      1. 1.7.1. 依赖传递
      2. 1.7.2. Maven依赖冲突
      3. 1.7.3. Maven项目的聚合