参考B站颜群老师Maven教程
Maven基础概念、仓库、构建与部署
- Maven的作用
- 管理jar
- 将项目拆分成若干个模块
管理Jar
- 增加第三方Jar
- 管理Jar包之间的依赖关系 Maven自动帮助下载jar包,通过给定坐标下载
jar包,jar包的依赖包Maven自动关联下载,并且不会有版本冲突
将项目拆分成多个模块
项目一般会分为三层(UI Service Dao) ,将大项目进行拆分每一层变为一个小项目
Maven的概念
是一个基于Java平台的自动化构建工具,能够完成以下操作,通俗讲就是将原
材料(Java,js,css等)变为产品(可发布的项目)
- 清理 清空编译的结果,为重新编译
- 编译 Java->class
- 测试 对项目的关键点用测试代码测试开发代码
- 报告 显示测试结果
- 打包 将项目中的多个文件压缩成一个文件用于安装或部署
- 安装 将打包后的文件放到本地仓库
- 部署 放到服务区准备运行
进一步理解安装
将项目放入本地仓库,可以通过本地仓库引用别的项目
进一步理解打包
比如一个在Eclipse中的项目部署是会生成一个对应的部署项目(遵循tomcat
目录结构),这个项目没有源码文件只有编译后的class文件,部署项目与原
项目目录结构不一样,原项目不能直接在tomcat中运行,只能运行部署项目,
如果非要运行原项目,可以将项目打成war包,此时可以运行。Java项目打成
一个jar包,web项目打成一个war包
进一步理解部署
将Java、Js、JSP等文件变成一个可以直接运行的项目而不是项目本身
- 本地仓库与中央仓库与镜像仓库
本地仓库
项目所需jar包先找本地仓库
中央仓库
本地找不到联网中央仓库一定有
镜像仓库
对中央仓库进行分流,缓解中央仓库压力
Maven安装配置、目录结构、配置文件
在Apache官网下载
- 下载配置Maven mvn -v 查看是否配置完成
- 配置JAVA_HOME
- 配置MAVEN_HOME
- 配置path
- 配置本地仓库
下载完成后的目录结构
修改本地仓库
1 | <localRepository>D:mvnrep</localRepository> |
使用Maven
约定优于配置,约定就是使用默认值,Maven约定了目录结构,pom文件中
唯一的坐标gav可以指定一个模块,将模块放入仓库中并且坐标就是唯一指
定的,main和test在同一个目录中相互之间不用导包
- Maven目录结构
- src
- src/main 写Java代码
- src/test 写测试方法
- pom.xml 项目对象模型
- target
- pom文件中的坐标结构
- groupId 域名翻转.大项目名
- artifactId 子模块名
- version 版本号
1 |
|
依赖
在Maven项目中如果要使用一个jar可以通过配置依赖去仓库寻找,jar
包只需要下载一次,jarA依赖于jarB就是A依赖于B,两个项目之间的依
赖,首先将要依赖的项目install放入本地仓库,然后再另一个项目中
引用要依赖的项目
依赖的范围
Maven在编译、测试、运行项目时各自使用一套classpath,jar包在编译
测试运行三种情况时在有些情况会使用有些情况不会使用,在gav后添加
scope标签就可以指定使用范围,默认是compile
compile | test | provided | |
---|---|---|---|
编译 | 有效 | 无效 | 有效 |
测试 | 有效 | 有效 | 有效 |
运行 | 有效 | 无效 | 无效 |
依赖排除
如果jarA依赖jarB,本质是jarA中的x.java依赖jarB中的y.java,这时
可以在依赖中添加参数排除jarB
1 | <exclusions> |
依赖的传递性
jarA依赖jarB,jarB依赖jarC,如果要使jarA依赖jarC,那么jarB和
jarC的范围是compile
依赖原则
最短优先原则,如果jarA依赖jarD1.0,而且也满足依赖传递通过jarB
依赖jarD1.1,那么依赖jarD1.0。路径长度相同,后面覆盖前面依赖本
情况不要出现。如果不同的pom中有两个相同依赖,那么先声明的依赖覆
盖后声明的依赖
Maven常用命令
- mvn compile 只编译main中的文件放入target中
- mvn test 先编译后测试
- mvn package jar/war,打包后放入target中
- mvn install 将打成的包放入本地仓库供其他项目使用,放入位置是根据gav
- mvn clean 删除target
Maven生命周期
执行某条命令之前会先执行之前的所有命令,默认生命周期从compile到install
Nexus
公司范围类有一个私服,现在本地仓库寻找,如果没有再在私服中寻找,将
jar包放入私服中后其他员工可以使用
在IDEA中指定本地仓库
Maven继承的实现
依赖传递有局限性,必须是compile才可以,通过继承可以不是compile,父工
程打包使用pom,子类引用父工程时发现并没有导入jar包,因为需要指定使用
父类的jar包,在依赖中只写ga,就能引入父类jar,父类中的jar不需要全部引
用,所以需要声明使用哪些
1 | <dependency> |
- 建立父工程
- 在父工程中导入依赖需要加一层
1
2
3
4<dependencyManagement>
<dependencies>
</dependencies>
<dependencyManagement> - 给当前工程加入父工程
1
2
3
4
5
6
7<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.RELEASE</version>
<!-- 当前工程pom.xml到父工程的pom.xml的相对路径-->
<relativePath/> <!-- lookup parent from repository -->
</parent>
Maven聚合
Maven项目只能识别自身包含的以及本地仓库中的,Maven1依赖Maven2,
必须先将Maven1 install放入本地仓库中才能使用Maven1,如果Maven1
依赖许多工程,可以使用聚合简化操作。在一个总工程中配置聚合,可以
避免子工程install操作,总工程打包方式必须为pom
1 | <modules> |