1. 介绍
Maven是java语言编写的,maven使用项目对象模型(POM)概念管理,可以通过一小段描述文件来管理项目的构建、报告和文档。在Maven中每个项目都相当于一个对象,对象与对象之间是有关系的,包含了:依赖、继承、聚合。实现Maven项目可以更方便地实现导jar包,拆分项目等效果。
Maven的作用:
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间版本冲突问题
项目构建:提供标准的,快速的,跨平台的自动化构建方式
统一开发结构:提供标准的、统一的项目结构
2. 安装
IDEA工具自带或者官网下载,Windows系统下载zip包解压缩。
解压后的目录结构
bin:存放Maven命令
boot:存放Maven自身的引导程序,类加载器
conf:存放Maven配置文件
lib:存放Maven本身运行所需的jar包
如果想在命令行使用Maven,要将包含bin文件夹的目录配置到环境变量
然后,终端执行mvn -v命令,得到以下输出则安装成功
Maven仓库
maven是基于坐标机制管理依赖,Maven中的仓库是用来存放maven构建的项目和各种依赖的。 maven仓库分类:
- 本地仓库: 位于自己计算机中的仓库, 用来存储从远程仓库或中央仓库下载的插件和 jar包,
- 远程仓库: 1)私服:局域网级(快),一般是公司内部的,阿里提供了一个免费的maven远程仓库。私服的作用:保存具有版权的资源,包含购买或自主研发的jar(中央仓库存储的都是开源的);一定范围内共享资源,仅对内部开放,不对外共享。 2)中央仓库: 在 maven 软件中内置一个远程仓库地址,由maven团队管理 repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由Maven 团队自己维护,里面存储了非常全的 jar包,它包含了世界上大部分流行的开源项目构件
坐标
定义:Maven中的坐标用于描述仓库资源的位置 组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis);
- artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS);
- version:定义当前项目版本号;
- packaging:定义该项目的打包方式;
作用: 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
仓库配置
本地仓库配置
在maven安装目录下的settings.xml文件中配置
修改localRepository元素配置项,默认是用户目录下的.m2文件夹,修改成你的仓库地址
远程仓库配置
- maven默认远程仓库的位置:国外仓库,访问很慢。
- 镜像仓库配置:settings.xml文件中mirrors元素。
全局setting和用户setting的区别
- 全局setting定义了当前计算机中maven的公共配置
- 用户setting定义了当前用户的配置
Maven项目结构
pom.xml的简单配置
Maven项目的构建
mvn compile // 编译
mvn clean // 清理
mvn test // 测试
mvn package // 打包
mvn install // 安装到本地仓库
在项目目录,pom.xml同级目录下执行命令:mvn compile
此时看到本地仓库已经有对应的插件,包括编译需要的插件以及项目依赖
下载依赖走的是我们配置的阿里云镜像地址
注:要确保java版本符合,否则会报错,这里是java 8
编译成功会在项目目录下生成一个target文件夹如下:
运行
mvn clean 可以删除编译产物
运行
mvn test 执行测试
测试未通过:
测试通过:
运行
mvn package 进行打包,此命令会先经过编译测试再打包
运行
mvn install 将打包的jar包按照坐标存入仓库
插件创建Maven工程
构建java项目
mvn archetype:generate "-DgroupId=com.companyname.bank" "-DartifactId=consumerBanking" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false"
- -DgroupId: 组织名,公司网址的反写 + 项目名称
- -DartifactId: 项目名-模块名
- -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用
- -DinteractiveMode: 是否使用交互模式
| 文件夹结构 | 描述 |
|---|---|
| consumerBanking | 包含 src 文件夹和 pom.xml |
| src/main/java contains | java 代码文件在包结构下(com/companyName/bank)。 |
| src/main/java test | 测试代码文件在包结构下(com/companyName/bank)。 |
| src/main/resources | 包含了 图片 / 属性 文件(在上面的例子中,我们需要手动创建这个结构)。 |
创建web应用
mvn archetype:generate -DgroupId=com.companyname.automobile -DartifactId=trucks -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
比java项目多一个文件夹:
| 文件夹结构 | 描述 |
|---|---|
| src/main/webapp | 包含 index.jsp 文件和 WEB-INF 文件夹. |
pom.xml文件:web应用打包方式 war
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.automobile</groupId>
<artifactId>trucks</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>trucks Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>trucks</finalName>
</build>
</project>
IDEA创建Maven工程
步骤:
tomcat插件安装
依赖管理
依赖传递 直接依赖:在当前项目中通过配置建立的依赖关系 间接依赖:被依赖的资源,如果依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题 路径优先:当依赖中出现相同资源时,层级越深,优先级越低,层级越浅,优先级越高; 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的; 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的;
可选依赖 指的是依赖不透明,你用的依赖其他项目不知道 true
排除依赖
定义:主动断开间接依赖
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围
主程序范围有效(main文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参与打包(package指令范围内)
依赖范围传递性
参考: