【Maven】Maven
Maven 简介
软件开发中的阶段
- 需要分析: 分析项目具体完成的功能,有什么要求,具体怎么实现
- 设计阶段:根据分析的结果,设计项目的使用什么技术,解决难点
- 开发阶段:编码实现功能,编译代码,自我测试
- 测试阶段:专业的测试人员,测整个项目的功能十分符合设计要求。出一个测试报告
- 发布阶段: 项目的打包,给用户安装项目
什么是 Maven
maven是apache基金会的开源项目,使用java语法开发。Maven这个单词的本意是:专家,内行。maven是项目的自动化构建工具,用于管理项目的依赖。下载地址: http://maven.apache.org/
Maven 能做什么
- 项目的自动构建,帮助开发人员做项目代码的编译,测试,打包,安装,部署等工作
- 管理依赖(管理项目中使用的各种jar包)
依赖:项目中需要使用的其他资源,常见的是jar。比如项目要使用mysql驱动。我们就说项目依赖mysql驱动。
Maven 中的概念
- POM
- 约定的目录结构
- 坐标
- 依赖管理
- 仓库管理
- 生命周期
- 插件和目标
- 继承
- 聚合
Maven 的核心概念
约定的目录结构
maven项目使用的大多人遵循的目录结构,叫做约定的目录结构。
一个maven项目是一个文件夹,例如:
POM
POM: Project Object Model 项目对象模型,maven把项目当做模型处理,操作这个模型就是操作项目。
maven通过pom.xml
文件实现项目的构建和依赖的管理:
1 |
|
坐标 gav
坐标概念来自数学,坐标组成是 groupid, artifiactId, version。
坐标作用:确定资源的,是资源的唯一标识。在maven中,每个资源都是坐标。坐标值是唯一的,简称叫gav:
1 | <groupId>com.bjpowernode</groupId> |
- groupId:组织名称,代码,公司,团体或者单位的标识。这个值常使用的公司域名的倒写
- artifactId:项目名称,如果groupId中有项目,此时当前的值就是子项目名。项目名称是唯一的
- version:版本,项目的版本号,使用的数字。三位组成。例如:5.2.5(主版本号.次版本号.小版本号) 注意:版本号中有
-SNAPSHOT
,表示快照,不是稳定的版本。
packaging为项目打包的类型,有jar ,war,ear,pom等等。默认是jar。区别:
- jar:将项目打成jar包,可以使用java命令直接执行
- war:将项目打成war包,需要放到Tomcat中执行
- pom:常用于Maven父工程,用于让子模块继承该父工程的
pom
文件。代表当前工程是纯pom工程,没有业务代码,只用于管理依赖,让子模块继承,从而做到依赖版本统一
搜索坐标的地址: https://mvnrepository.com/
依赖 dependency
依赖:项目中要使用的其他资源(jar)。 需要使用maven表示依赖,管理依赖。通过使用dependency和gav一起完成依赖的使用
需要在pom.xml
文件中,使用dependencies
和dependency
,还有gav完成依赖的说明。格式:
1 | <dependencies> |
仓库
仓库是存东西的,maven的仓库存放的是:
- maven工具自己的jar包
- 第三方的其他jar,比如项目中要使用mysql驱动
- 自己写的程序,可以打包为jar,存放到仓库。
仓库的分类:
本地仓库(本机仓库): 位于你自己的计算机,它是磁盘中的某个目录。修改本地仓库的位置:修改maven工具的配置文件(maven的安装路径/conf/setting.xml
)
远程仓库: 需要通过联网访问的
- 中央仓库: 一个ftp服务器,存放了所有的资源。
- 中央仓库的镜像: 就是中央仓库的拷贝。在各大主要城市都有镜像。
- 私服:在局域网中使用的。私服就是自己的仓库服务器,在公司内部使用的。
maven使用仓库: maven自动使用仓库,当项目启动后,执行了maven的命令,maven首先访问的是本地仓库,从仓库中获取所需的jar,如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像。
Maven 的生命周期,插件和命令
maven的生命周期: 项目构建的各个阶段。包括清理,编译,测试,报告,打包,安装,部署
- 插件:要完成构建项目的各个阶段,要使用maven的命令,执行命令的功能是通过插件完成的。插件就是jar,一些类。
- 命令: 执行maven功能是由命令发出的。比如
mvn compile
常用命令:
mvn clean
:清理命令,作用是删除以前生成的数据,即删除target
目录mvn compile
:编译命令,执行的代码编译,把src/main/java
目录中的java代码编译为.class
文件。同时把.class
文件拷贝到target/classes
目录。这个目录classes
是存放类文件的根目录(也叫做类路径,classpath
)mvn test-compile
:编译命令,编译src/test/java
目录中的源文件,把生成的.class
拷贝到target/test-classes
目录。同时把src/test/resources
目录中的文件拷贝到test-clasess
目录mvn test
:测试命令,作用执行test-classes
目录的程序,测试src/main/java
目录中的主程序代码是否符合要求。mvn package
:打包,作用是把项目中的资源.class
文件和配置文件都放到一个压缩文件中,默认压缩文件是jar类型的。web应用是war类型,扩展是jar,war的。mvn install
:把生成的打包的文件 ,安装到maven仓库。
自定义配置插件
在pom.xml
文件中,<build>
标签里设置插件
1 | <!-- 设置构建项目相关的内容 --> |
Maven 和 IDEA 的集成
IDEA中有一个自带的maven,我们要让idea使用自己本地安装的maven。
- 选择
File- Settings
设置项: -DarchetypeCatalog=internal
File - Other Settings
同上的设置
依赖管理
依赖范围:使用scope
表示依赖的范围。依赖范围表示: 这个依赖(jar和里面类)在项目构建的那个阶段起作用。
依赖范围scope
类型:
- compile:默认,参与构建项目的所有阶段
- test:测试,在测试阶段使用,比如执行
mvn test
会使用junit 。 - provided:提供,项目在部署到服务器时,不需要提供这个依赖的jar ,而是由服务器这个依赖的jar包。例如
servlet
和jsp
依赖需要使用provided
范围,让部署的Tomcat提供其依赖。 - import:必须用在
<dependencyManagement>
标签内,与scope
中的pom
类型配合使用,用于将目标工程的pom
文件中的依赖内容直接复制到当前项目中,从而做到分类管理,即将不同类型的依赖放在不同的pom
文件中,使用这些大量的依赖只需要import
少量的pom
文件即可,例如:
1 | <!-- spring boot 2.2.2 --> |
只需要import
三个pom
文件即可导入大量的依赖,从而做到依赖的分类管理。其中导入的spring-boot-dependencies
的scope
类型为pom
:
1 | <groupId>org.springframework.boot</groupId> |
<dependencyManagement>
标签常用于父工程中,用于管理子模块的依赖。在其下创建的子模块不再需要填写依赖的版本号(版本号都在父工程中指定了),若需要自定义版本号,只需要在子模块的pom文件里自定义修改即可,其会遵循就近原则。
父工程使用如下两种标签管理依赖时的区别:
<dependencies>
:其内的所有依赖都会被子模块直接继承,坏处是引入了大量的冗余依赖<dependencyManagement>
:其内的依赖子模块不会直接拥有,需要子模块自己按需添加<dependency>
标签引入,好处是不需要全部引入父工程的所有依赖
Maven父工程里只能有pom文件,不需要有src
目录和target
目录,其作用仅仅是用于定义子模块需要用到的依赖版本,不需要有业务代码。
常用设置
properties
里面的配置:
1 | <properties> |
全局变量
在properties
定义标签,这个标签就是一个变量,标签的文本就是变量的值。使用全局变量表示多个依赖使用的版本号。
使用步骤:
- 在
properties
标签中,定义一个标签,指定版本的值
1 | <properties> |
- 使用全局变量,语法
${变量名}
1 | <dependency> |
- 使用资源插件,处理配置文件的信息
- maven会把
src/main/resources
目录中的文件,拷贝到target/classes
目录下 - maven只处理
src/main/java
目录中的.java
文件,把这些.java
文件编译为.class
,拷贝到target/classes
目录中。不处理其他文件。
1 | <build> |
以上配置可用于解决MyBatis的mapper文件导出问题。
Maven 打包跳过测试
使用Maven打包的时候,可能会因为单元测试打包失败,这时候就需要跳过单元测试。
一、命令行方式跳过测试
我们可以用两种命令来跳过测试
mvn clean install -DskipTests
:不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。跳过单元测试,但是会继续编译。mvn clean install -Dmaven.test.skip=true
:不执行测试用例,也不编译测试用例类。不但跳过单元测试的运行,也跳过测试代码的编译
二、pom.xml中配置跳过测试
可以在 pom.xml
中添加如下配置来跳过测试:
1 | <build> |
三、Idea中配置跳过测试
- 直接配置:Maven命令栏的工具栏有下图中的图标,这个图标就是 Skip Tests。点击选中,再用LifeStyle 中的打包就会跳过测试:
- 更改 Maven 配置
- 方式 1:打开配置,找到 Maven–>Runner,在 VM option 中添加
-Dmaven.test.skip=true
- 方式2:Runner–> Propertis 中选中 Skip tests