Maven
自动化的项目构建工具。
make->ant->maven->gradle
优点
1、做分布式开发非常方便
2、依赖管理
安装
[https://maven.apache.org/download.cgi](https://maven.apache.org/download.cgi) 下载maven,压缩包,解压即可使用。
配置环境变量
测试maven是否安装成功:在命令行中使用 mvn -v
Maven项目的结构
**(约定大于配置)**<br />![E6_F{$0]ZDDNG9659E[2]]B.png](https://cdn.nlark.com/yuque/0/2021/png/20356700/1622260636899-8550e3f8-4dbd-49d5-8ffa-281e28f16ede.png#clientId=uf66fccb4-30b8-4&from=drop&id=u44966503&margin=%5Bobject%20Object%5D&name=E6_F%7B%240%5DZDDNG9659E%5B2%5D%5DB.png&originHeight=547&originWidth=328&originalType=binary&size=16688&status=done&style=none&taskId=u9dc7c457-94b5-4fa2-8623-e69aa248e7d)
maven在项目构建过程中,最主要的几种操作:
- 清理:删除之前编译的结果,为下一次编译做准备。
对应的maven命令:mvn clean - 编译:将java源文件编译为字节码文件。
对应的maven命令:mvn compile(编译主程序)或者mvn test-compile(编译测试程序) - 测试:对项目开发的关键节点进行测试,保证项目在迭代开发过程中关键节点的正确性。
对应的maven命令:mvn test - 报告:对测试结果使用标准格式进行记录和展示。
- 打包:将一个包含诸多文件项目封装成一个可被安装或部署的包。java项目->jar,web项目->war
对应的maven命令:mvn package - 安装:在maven环境中,安装是指将打包结果安装到maven的本地仓库。
对应的maven命令:mvn install
maven的相关配置:
1、本地仓库路径
<localRepository>E:/maven/repository</localRepository>
如果不配置,默认的本地仓库在c:/users/.m2目录中
一般都需要修改本地仓库路径。
2、中央仓库镜像
<mirrors>
<mirror>
<id>aliyun-public</id>
<mirrorOf>*</mirrorOf>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>aliyun-central</id>
<mirrorOf>*</mirrorOf>
<name>aliyun central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>aliyun-spring</id>
<mirrorOf>*</mirrorOf>
<name>aliyun spring</name>
<url>https://maven.aliyun.com/repository/spring</url>
</mirror>
<mirror>
<id>aliyun-spring-plugin</id>
<mirrorOf>*</mirrorOf>
<name>aliyun spring-plugin</name>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
</mirror>
<mirror>
<id>aliyun-apache-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun apache-snapshots</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
<mirror>
<id>aliyun-google</id>
<mirrorOf>*</mirrorOf>
<name>aliyun google</name>
<url>https://maven.aliyun.com/repository/google</url>
</mirror>
<mirror>
<id>aliyun-gradle-plugin</id>
<mirrorOf>*</mirrorOf>
<name>aliyun gradle-plugin</name>
<url>https://maven.aliyun.com/repository/gradle-plugin</url>
</mirror>
<mirror>
<id>aliyun-jcenter</id>
<mirrorOf>*</mirrorOf>
<name>aliyun jcenter</name>
<url>https://maven.aliyun.com/repository/jcenter</url>
</mirror>
<mirror>
<id>aliyun-releases</id>
<mirrorOf>*</mirrorOf>
<name>aliyun releases</name>
<url>https://maven.aliyun.com/repository/releases</url>
</mirror>
<mirror>
<id>aliyun-snapshots</id>
<mirrorOf>*</mirrorOf>
<name>aliyun snapshots</name>
<url>https://maven.aliyun.com/repository/snapshots</url>
</mirror>
<mirror>
<id>aliyun-grails-core</id>
<mirrorOf>*</mirrorOf>
<name>aliyun grails-core</name>
<url>https://maven.aliyun.com/repository/grails-core</url>
</mirror>
<mirror>
<id>aliyun-mapr-public</id>
<mirrorOf>*</mirrorOf>
<name>aliyun mapr-public</name>
<url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>
</mirrors>
修改中央仓库镜像的目的是,下载资源时从国内地址下载,下载速度加快。
3、jdk版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
maven的生命周期
maven的核心程序定义了三套相互独立的生命周期,生命周期中各个阶段的具体任务是插件来完成。
maven核心程序为了更好的实现自动化构建,设定了一个生命周期执行规则:**不管是执行生命周期中的哪一个阶段,都会从当前生命周期的最初位置开始执行**。
maven的三套生命周期
clean lifecycle
在项目构建之前执行的一些清理工作,clean生命周期包含三个阶段:
- pre-clean:执行清理工作之前做的一些事情
- clean:执行清理工作
- post-clean:执行完清理工作之后做的一些事情
default lifecycle
是项目构建的核心部分,编译、测试、打包、安装、部署等,default生命周期是maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources:复制并处理资源文件,放到目标目录,准备打包。
- compile:编译项目主程序源代码 mvn compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources:复制并处理资源文件,放到测试目录。
- test-compile:编译项目测试程序源代码 mvn test-compile
- process-test-classes
- test:使用合适的单元测试框架运行测试,测试代码不会被打包和部署。 mvn test
- prepare-package
- package:接受编译好的代码,打包成可发布的格式。jar或war等。 mvn package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install:将打包结果安装到maven本地仓库,以便于其他项目进行依赖。mvn install
- deploy:将最终的包复制到远程仓库,以便其他开发人员与项目共享,或者把war包部署到服务器上运行。mvn deploy
site lifecycle
site生命周期用于生成项目报告,生成一个站点,发布站点。
- pre-site:在生成站点文档之前做的一些事情
- site:生成站点文档
- post-site:生成站点文档之后做的一些事情
- site-deploy:将生成的站点文档部署到特定的服务器上。
maven的坐标:
<groupId>com.woniuxy.controller</groupId>
<artifactId>UserController</artifactId>
<version>1.0-SNAPSHOT</version>
:一般描述公司信息
:一般描述项目信息
:描述项目的版本信息
通过坐标,可以在仓库中唯一定位一个项目。
idea中maven的配置:
file->settings->build,ex……->maven
需要配置三个内容:
maven home directory:maven的安装目录
user settings file:指定maven使用哪个settings.xml文件
local repository:指定本地仓库路径
idea中创建maven的web项目
1、勾选 create from archetype
2、选中org.apatch.maven.archtype:web app
3、在创建好的项目的main目录下,补上 java (source ROOT)和resources (resource ROOT)目录
4、在tomcat中部署当前项目。
maven的依赖
mvnrepository.com 寻找依赖的网站
maven项目使用标签来引入外部依赖(第三方的jar):在本地仓库中引入相应的资源<br />标签不能独立存在,必须出现在中,作为子元素<br />标签中配置的是一个maven项目的坐标。
用于指定导入的依赖的作用范围
- compile:默认值,表示当前依赖会参与项目的编译、测试、和运行阶段,属于强依赖,打包时,会打进对应的包中。
- test:表示当前依赖仅仅只参与测试相关的内容,包括测试用例的编译和执行。典型:junit。
- runtime:当前依赖只参与运行周期中的使用。一般来说,这种都是接口与实现相分离的类库,典型:JDBC类库,在编译时仅依赖相关接口,在具体运行时才需要具体的数据库驱动程序。
- provided:表示当前依赖不参与打包过程,这个依赖由运行时环境来提供。典型:servlet-api.jar。
- system:使用上跟provided相同,表示当前依赖不从maven仓库中获取,而从本地文件系统中获取。
- import:只能在dependencyManagement中使用,能解决maven单继承的问题,import的依赖关系实际上并不参与限制依赖关系的传递性。
<!--
maven项目使用<dependency>标签来引入外部依赖(第三方的jar):在本地仓库中引入相应的资源
<dependency>标签不能独立存在,必须出现在<dependencies>中,作为子元素
<dependency>标签中配置的是一个maven项目的坐标。
<groupId></groupId>
<artifactId></artifactId>
<version></version>
mvnrepository.com 寻找依赖的网站
<scope>用于指定导入的依赖的作用范围
-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.woniuxy.controller</groupId>
<artifactId>UserController</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
maven的继承和聚合
maven的继承
maven项目的分类
在maven中,根据项目打包类型的不同,将项目分为三种类型:jar、war、pom。
- jar:普通java项目
- war:web项目
pom:父项目,如果项目下有子项目存在,则该项目的打包类型一定是pom。
通过<packaging>来设置项目的打包类型。
<packaging>jar|war|pom</packaging>
在某个项目的pom.xml中使用<parent>标签来声明该项目的父项目信息后,该项目就作为父项目的子项目出现,从而实现了maven的项目继承。
1、将父项目的打包方式设置为pom
<packaging>pom</packaging>
2、子项目中使用标签实现继承
<!--
<packaging>用于设定当前项目的打包类型,默认打包类型是jar
jar :普通java项目
war :web项目
pom :父项目
对于pom(父)项目来说,一般不会有具体的代码
-->
<packaging>jar</packaging>
<parent>
<!--
<groupId>
<artifactId>
<version>
就是一个maven的坐标,用于定位父项目
<relativePath>:用于定位父项目的pom.xml
-->
<groupId>a.b.c</groupId>
<artifactId>d</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../d/pom.xml</relativePath>
</parent>
在maven的继承中,父项目与子项目之间只有逻辑上的父子关系,也就是说子项目不会被包含在父项目中。
maven的聚合
maven项目的聚合是建立在继承的基础上的。
在父项目中使用<modules>标签将子项目引入父项目,此时就实现了maven项目的聚合,给父项目打包时,子项目的内容也会被打包。
<!-- 指定当前项目中应该包含的模块 -->
<modules>
<module>../e</module>
</modules>
父项目统一管理依赖版本
父项目使用导入对应的依赖,此时依赖不会真正导入项目,而在子项目中通过引入对应依赖时才会真正导入项目。
父项目
<properties>
<spring.version>5.3.2</spring.version>
</properties>
<!-- 使用dependencyManagement引入的依赖不会立即加载到maven项目中 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子项目
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>