Maven
文章目录
Maven入门
Maven项目管理工具概述
- maven项目管理工具是apach旗下一款跨平台的项目管理工具,用于项目构建和项目依赖
- 跨平台
- maven项目管理工具由java语言开发,所以具有跨平台特性
- 项目构建
- 将一个写好的项目变成一个可以运行的项目的过程
- 项目构建阶段
- 清理
- 清理上一次编译之后的字节码文件
- 编译
- 将写好的项目编译为class字节码文件
- 测试
- 执行项目中所有测试单元的代码
- 打包
- 将写好的项目打包为指定格式的包
- 部署
- 将项目发布到Tomcat服务器上
- 清理
- 项目依赖
- 项目jar包管理
- maven自动帮我们下载jar包,管理jar包
- maven自动帮我们下载jar包,管理jar包
- 项目jar包管理
Maven项目管理工具的作用
- 在没有maven之前
- 手动下载jar包,构建jar包类路径
- 在下载jar包的过程中,需要下载jar包依赖的其他jar包
- 每次新建项目都要下载jar包,导致重复jar包占用项目空间
- 没有maven之前项目按照功能划分合作开发
- 有了maven之后
- maven自动从中央仓库或者镜像仓库下载jar包
- maven可以自动下载jar包依赖的其他jar包
- maven提供了一个本地仓库用于存放项目需要的所有jar包
- maven不仅可以根据功能划分项目,还可以根据项目结构 Controller,Service,Dao,Bean,Util划分项目来合作开发
Maven 功能
- Maven 能够帮助开发者完成以下工作:
- 构建
- 文档生成
- 报告
- 依赖
- SCMs
- 发布
- 分发
- 邮件列表
Maven项目工具的具体使用
-
下载安装Maven项目管理工具
- Maven 下载地址: http://maven.apache.org/download.cgi
-
解压配置环境变量
- 详情见参考资料: https://www.runoob.com/maven/maven-setup.html
-
修改Maven配置文件
-
修改
conf
文件夹下的setting.xml
-
<localRepository>D:\repository</localRepository>
-
-
配置镜像仓库路径
-
<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
-
-
指定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>
-
-
在
cmd
输入指令mvn -v
查看Maven信息配置是否成功
-
Eclipse中的使用
- 配置Maven项目管理工具
- 创建项目
- Maven普通项目
- MavenWeb项目
- Maven项目标准结构目录
- Maven普通项目比普通java项目多了
src/test/java
src/test/resources
- MavenWeb项目比Maven普通项目多了
src/webapp
- Maven项目比普通Java项目多了
pom.xml
- Maven普通项目比普通java项目多了
pom.xml文件使用
-
标签名介绍
标签名 介绍 <project>
文件的根节点 <modelversion>
pom.xml 使用的对象模型版本 <groupId>
项目名称,一般写项目的域名 <artifactId>
模块名称,子项目名或模块名称 <version>
产品的版本号 <packaging>
打包类型,一般有 jar、war、pom 等 <name>
项目的显示名,常用于 Maven 生成的文档 <description>
项目描述,常用于 Maven 生成的文档 <dependencies>
项目依赖构件配置,配置项目依赖构件的坐标 <build>
项目构建配置,配置编译、运行插件等
-
指定坐标
-
<!-- 坐标:指的是项目打包之后在仓库中的具体位置 groupId:分组坐标,通常以公司域名反写命名; artifactId:唯一坐标,统一以项目名称命名; version:版本号 --> <groupId>com.danny</groupId> <artifactId>maven</artifactId> <version>0.0.1-SNAPSHOT</version>
-
-
指定打包格式
-
<!-- packaging指定打包格式: jar:maven普通项目最终都是打包为jar war:mavenweb项目最终打包格式为war pom:多模块项目中,父模块项目的打包格式 --> <packaging>war</packaging>
-
-
指定下载依赖和配置依赖作用范围
-
<!-- dependency依赖:用于下载jar包 --> <!-- scope指定jar包的作用范围: test:指定该jar包只能应用在测试程序中,不能应用在主程序中 provided:主程序和测试程序都可以使用,该jar包只参与编译打包,不参与部署; compile(默认作用范围):主程序和测试程序都可以使用,并且参与项目整个生命周期:编译打包部署 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>provided</scope> </dependency>
依赖范围 对于编译classpath有效 对于测试classpath有效 对于运行时classpath有效 例子 compile Y Y Y spring-core test - Y - Junit provided Y Y - servlet-api runtime - Y Y JDBC驱动 system Y Y Y 本地的.Maven仓库之外的类库 - 测试总结:
- 默认引入 的 jar 包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
- servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和 tomcat 下 jar 冲突)
- jdbc 驱动 jar 包 ---- runtime (测试、运行 有效 )
- junit ----- test (测试有效) 依赖范围由强到弱的顺序是:compile>provided>runtime>test
-
-
maven下载jar包依赖的其他jar包(依赖传递)
- maven只会自动下载jar包依赖的compile范围内的jar包
-
maven的依赖排出
-
<!--maven可以排除jar包依赖的其他jar包:--> <dependency> <groupId>com.danny</groupId> <artifactId>maven</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 排出maven普通项目中的junitjar包 --> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency>
-
-
maven自动解决jar包冲突
- maven在解决jar包冲突时:
- 路径不同,根据就近原则选择使用jar包;
- 路径相同时,maven选择pom.xml文件中后引入的jar包;
- maven在解决jar包冲突时:
Maven常用命令
命令 | 名称 | 描述 |
---|---|---|
clean | 清理 | 清除项目上一次编译的字节码文件 |
compile | 编译 | 将项目编译为字节码文件 |
test | 测试 | 执行项目中所有的单元测试 |
package | 打包 | 将项目打包为指定格式的包,存放在target 目录下(不会放到仓库中) |
install /deploy | 部署 | 将项目打包为指定格式的包,并将项目存放到仓库中 |
-
清理
- 通过clean插件执行清理操作:maven-clean-plugin:2.5:clean
-
编译
- 绑定插件maven-resources-plugin:2.6:resources扫描项目主程序文件
- 绑定插件maven-compiler-plugin:3.1:compile:编译项目主程序文件
-
测试
-
绑定插件maven-resources-plugin:2.6:resources扫描项目主程序文件
-
绑定插件maven-compiler-plugin:3.1:compile:编译项目主程序文件
-
绑定插件maven-resources-plugin:2.6:testResources :扫描测试程序
-
绑定插件maven-compiler-plugin:3.1:testCompile:编译测试程序
-
绑定插件maven-surefire-plugin:2.12.4:test:执行测试单元并生成测试报告
-
设置执行所有单元测试:
-
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12</version> <configuration> <includes> <include>*\*\*\*Test.java</include> <include>**\*</include> </includes> </configuration> </plugin> </plugins> </build>
-
-
-
打包
- 绑定插件maven-resources-plugin:2.6:resources扫描项目主程序文件
- 绑定插件maven-compiler-plugin:3.1:compile:编译项目主程序文件
- 绑定插件maven-resources-plugin:2.6:testResources :扫描测试程序
- 绑定插件maven-compiler-plugin:3.1:testCompile:编译测试程序
- 绑定插件maven-surefire-plugin:2.12.4:test:执行测试单元并生成测试报告
- 绑定插件maven-jar-plugin:2.4:jar :将项目打包为指定格式存放到target目录下
-
部署
- 绑定插件maven-resources-plugin:2.6:resources扫描项目主程序文件
- 绑定插件maven-compiler-plugin:3.1:compile:编译项目主程序文件
- 绑定插件maven-resources-plugin:2.6:testResources :扫描测试程序
- 绑定插件maven-compiler-plugin:3.1:testCompile:编译测试程序
- 绑定插件maven-surefire-plugin:2.12.4:test:执行测试单元并生成测试报告
- 绑定插件maven-jar-plugin:2.4:jar :将项目打包为指定格式存放到target目录下
- 绑定插件maven-install-plugin:2.4:install:将打包好的项目部署到本地仓库
Maven 构建生命周期
- Maven 构建生命周期定义了一个项目构建跟发布的过程。
- 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
![img](https://www.runoob.com/wp-content/uploads/2018/09/7642256-c967b2c1faeba9ce.png)
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
- 为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。
- Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
- default(或 build):项目部署的处理
- 默认生命周期:编译,测试,打包,部署
- site:项目站点文档创建的处理
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
- clean:项目清理的处理
Maven多模块项目
多模块中的聚合
-
<modules>
-
多模块项目中的聚合标签
-
可以提高操作父项目模块来操作它的各个子模块项目
-
<modules> <module>controller</module> <module>service</module> <module>dao</module> <module>bean</module> <module>util</module> </modules>
-
多模块中的继承
-
<parent>
-
多模块项目中的继承标签
-
继承标签里面的坐标代表继承的父项目,包含父类项目中以下内容
- 项目坐标的
groupId
和version
- 项目描述信息
- compile作用范围内的jar包
- 统一定义的变量
- 项目坐标的
-
<parent> <artifactId>parent</artifactId> <groupId>com.offcn</groupId> <version>1.0-SNAPSHOT</version> </parent>
-
统一变量定义
-
<properties>
-
统一变量替换,通过
${变量名}
获取变量-
<properties> <spring.version>5.1.2.RELEASE</spring.version> </properties> ... <version>${spring.version}</version>
-
统一jar包版本管理(锁定版本)
-
<dependencyManagement>
-
统一jar包版本管理,只是声明jar包版本,不做jar包下载
-
子类项目如果需要使用父类声明过的jar包可以直接通过
<dependency>
标签增加依赖,但不需要输入版本号,如下 -
父类
pom.xml
中-
<properties> <spring.version>5.1.2.RELEASE</spring.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement>
-
-
子类
pom.xml
中-
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> </dependencies>
-