maven
1. 简介
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
Maven最常见的用于就是用来导包。
使用eclipse或其他编辑器的,请自行百度下载按照方法,博主使用的IDEA自带maven
2. maven仓库
本地maven仓库默认路径在
C:\Users\电脑用户名.m2\repository
用于存放网上下载到本地的jar包。
配置仓库路径在maven的bin目录下的config/settings.xml
maven会默认从中央仓库(可以理解为maven提供的官方仓库)下载jar包到本地。
官网的仓库一般下载都太慢了,可以配置国内仓库。
在setting.xml的mirrors中更改如下:
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<!-- 中央仓库1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央仓库2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
3. 创建maven工程
先用IDEA创建maven工程
- GroupId:顾名思义,这个项目属于哪个组,自己按需求写,新手学习一般来说没有组可严,可以写com.test.demo
- ArtifactId:表示这个项目的唯一ID,一般来说就是项目名称
创建完毕之后,会看到一个pom.xml文件,这就是maven管理的核心。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
上面这句话的意思就是导入junit包的意思。
点击Enable Auto-Import,以后导入的依赖会自动下载。
4. 坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
这个xml代码,就是一个maven坐标,表示junit4.10的坐标,通过坐标定位一个唯一确定的jar包。
- groupId:定义当前Maven组织名称
- artifactId:定义实际项目名称
- version:定义当前项目的当前版本
坐标的查找,在maven仓库中搜索即可。
由坐标的概念,很容易知道,可以进行“项目与项目之间的引用”,只需要在某个项目的pom中添加创建项目时填写的
即可。
简称GAV。
5. 常用命令
maven可以使用终端命令行,但是IDEA集成了maven工具,因此,我们可以直接使用。
在上图“3”处即可写以下maven命令。
如果使用终端,cd到项目路径即可
mvn compile
- 完成编译操作
- 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
mvn clean
- 执行完毕后,会将target目录删除。
mvn test
- 完成单元测试操作
- 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
mvn package
- 完成打包操作
- 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war
mvn install
- 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作
- 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
mvn 组合命令
- mvn clean compile
- mvn clean test
- mvn clean package
- mvn clean install
6. 依赖管理
6.1 依赖范围 – scope
scope表示通过该依赖引入的jar包的生效范围(也作用来控制依赖和编译,测试,运行的classpath的关系)。
主要的是三种依赖关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
- test:测试依赖范围。只对于测试classpath有效
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api(最常见的是用于“排除打包”,比如springboot自带tomcat,若想打包后使用其他服务器,则需要将springboot自带的tomcat的scope设置为provided)
- runtime:运行时提供。例如:jdbc驱动
scope的默认值是compile
6.2 依赖传递
不必死记硬背,自然而然地理解即可。
test1依赖了test2,test2依赖了test3,因此test1也会依赖test3。
test1与test3称为“间接依赖”;
其他称为“直接依赖”
当第二依赖的范围是compile的时候,依赖可以传递
当第二直接依赖的范围是test的时候,依赖不会得以传递
6.3 依赖冲突(常见)
- 假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
- 假如test2使用junit4.9依赖,那test3会使用【就近的一个依赖】,也就是使用junit4.9
也就是就近原则。
6.4 可选依赖(是否不传递依赖)
<optional> true/false<optional> 是否可选,也可以理解为是否不向下传递。
如果是true则不传递依赖,如果是false就传递,默认为false。
6.5 排除依赖(常用)
exclusions可用于排除依赖(注意exclusions写在dependency中)
比较常见的是,比如springboot自带的日志系统是logback(logging),而我们要用log4j2,则需要将logback排除。
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
此外,A依赖B,B依赖C,因此A也依赖了C。但实际情况中A可能不需要C,因此可以在A中将C排除。
7. maven生命周期(理解)
Maven生命周期就是为了对所有的构建过程进行抽象和统一。
包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
生命周期可以理解为构建工程的步骤。
在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。
Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle: 生成项目报告,站点,发布站点。
7.1 Clean生命周期:清理项目
Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
也就是说,mvn clean 等同于 mvn pre-clean clean
如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
这是Maven很重要的一个规则,可以大大简化命令行的输入。
7.2 Default生命周期:构造项目
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
运行任何一个阶段的时候,它前面的所有阶段都会被运行
(这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包,安装到本地仓库)
此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
7.3 Sit生命周期:生成项目站点(了解)
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
Manager比较喜欢,文档及统计数据自动生成,很好看。我们就不用学,以后自己研究
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
8. maven 插件plugins
plugins就是插件的意思,可以通过maven引入一些插件来实现特殊功能。
指定jdk版本
<!--build与dependencies是平级的-->
<build>
<plugins>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8></sourcec>
<target>1.8></target>
<encoding>UTF-8</encoding>
</configuration>
</plugins>
</build>
mybatis自动生成插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.1</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
外部war包打包配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- <includeSystemScope>true</includeSystemScope>-->
<mainClass>xyz.shunxu.DaidiweiApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
9. 继承
继承是为了消除重复,可以把很多相同的配置提取出来。例如:grouptId,version等。
父工程只用于写pom文件。
9.1 创建父工程
9.2 创建子工程
在子工程中指定Parent Project即可。
9.3 父工程统一管理依赖
在父工程中通过配置dependencies依赖,子工程可以直接继承使用,如下图
在父工程中通过配置dependencyManagement管理依赖的版本号。
注意:此处只是定义依赖jar包的版本号,并不实际依赖。如果子工程中需要依赖jar包还需要添加dependency节点。
9.4 父工程提取版本号
当父工程中定义的jar包越来越多,找起来越来越麻烦,所以可以把版本号提取成一个属性集中管理。
在父工程的pom.xml中配置一个properties标签,里面的标签自己自定义即可
9.5 springboot中的父工程(了解)
在springboot项目的pom.xml中的最上方,就可以看到项目的父工程是spring-boot-starter-parent。
我们可以点进去看看,发现在最上方依旧还有一个父工程spring-boot-dependencies。
我们继续点进去。
可以看到,这里定义了非常多的版本号。
因此,spring-boot-dependencies定义过的版本号,我们都不需要再指定版本。
10. 项目聚合(重要)
聚合一般是一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。
例如电商项目中,包括商品模块、订单模块、用户模块等。就可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。
例如同一个项目中的表现层、业务层、持久层,也可以分层创建不同的工程,最后打包运行时,再聚合到一起。
10.1 创建聚合项目(Springboot)
创建非springboot聚合项目请参考链接
聚合模块的创建的packaging也是使用pom,GroupId和ArtifaceID根据项目来写。
假设现在通过对一个电商项目进行聚合划分。
10.1.1 创建父工程
创建一个空的SpringInitializr项目
注意Artifact不能存在大写
父工程仅用于编辑pom.xml,将多余的文件删除
将打包方式改成pom
10.1.2 创建子工程
同样是选择SpringInitializr
将父工程改成platform
可将多余的springboot依赖删除,从父工程中自动引入即可。
父工程添加子模块
同理,依次创建其他模块即可。注意更改子模块的parent以及父工程中引入子模块即可。
10.2 模块引用
模块之间的互相引用,只需要加上对方的maven坐标即可。
10.3 模块打包
直接对父工程进行maven打包即可,然后所有的子模块都会生成响应的target文件,模块引用也会自动实现对模块间的引用打包。
比如web模块引用了其他所有模块,最终运行web模块中的target下的jar包即可。
10.4 推荐阅读
11. maven仓库
用来统一存储所有Maven共享构建的位置就是仓库。
仓库包括:
-
本地仓库
- ~/.m2/repository每个用户只有一个本地仓库
-
远程仓库
-
中央仓库:Maven默认的远程仓库,不包含版权资源 http://repo1.maven.org/maven2
但是中央仓库地址一般都下载比较慢时,可以换成阿里云的中央仓库
http://maven.aliyun.com/nexus/content/repositories/central/
也可以自己抢建一个仓库服务器来下载依赖 -
***:是一种特殊的远程仓库,它是架设在局域网内的仓库
-
nexus就是用来创建maven的***的,也就是提高依赖的***,(其实我们用阿里云的***就好了)
更改IDEA默认仓库以及镜像
想要修改Maven默认的下载仓库,其实我们只需要找到Maven的settings.xml文件。
如果使用的是IDEA默认的Maven,那么settings.xml默认存放地址为IDEA安装路劲下的:
\JetBrains\IntelliJ IDEA xxx.xxx\plugins\maven\lib\maven3\conf
复制一份settings.xml 到:C:\Users\You user.m2(默认本地存放下载的jar包位置为当前用户文件下下的.m2文件中)下也就是你的本地maven仓库下。
修改settings.xml 文件,找到 标签,并添加如下阿里maven仓库配置:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
最后修改 IDEA 中的配置File----> settings --> Build,Executon,Deployment --> Maven:选择你settings.xml文件路径,勾选 Override 便可。