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 | <mirror> |
宏变量
工程版本号
1 | <dependency> |
属性_版本号
1 | <!--统一管理jar包和版本--> |
maven的传递、冲突、聚合
依赖传递
有三个项目:ABC
1 | A |
B是依赖A的,C又是依赖B的,所以依赖传递,C也是依赖A的
A B 项目打成jar包到本地仓库中:
clean package(打成jar包) => install(jar包安装到本地仓库)
clean compile(编译)
pom.xml文件中的依赖配置
1 | B是依赖A的,在B的pom.xml文件中写入A的坐标 |
A、B、C项目各自打包、编译,在C的项目的Maven dependencies引入中不仅会引入B,而且还会引入A项目,这就是依赖的传递。
如果项目C只想依赖B,不想依赖A怎么办? 排除依赖:exclusions
1 |
|
这样在C项目编译后compile,就排出对A的依赖
Maven依赖冲突
- 原则1:短路优先,如果A需要导入一个依赖X,在路径中选择最短的。
- 原则2:在路径相同时,先声明先优先。如果A需要导入一个依赖X,1、2路线相同,在A中的pom.xml先声明B(C),就引入B(C)的X(jar)。
1 | 在传递依赖的原则下,A->B->C->X(jar) 路线1 |
Maven项目的聚合
在D项目中聚合 ABC三个项目,D的pom.xml文件如下所示
1 |
|
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.