maven适用于快速、方便构建项目资源的软件,能够通过简单的配置就是先对项目的依赖资源进行管理
maven是如果做到的?pom的配置文件
maven项目的构建是基于pom(Project Object Model)文件进行的,项目的所有配置信息都会存放在pom文件中,包括了项目的类型、名字、依赖关系、定制插件等等
pom文件实例
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itwanger</groupId>
<artifactId>MavenDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MavenDemo</name>
</project>
- project:是pom文件的根元素,声明了pom文件的命名空间和xsd元素
-
- 关于命名空间和xsd元素的理解和定义,参考这篇文章www.jianshu.com/p/49d44ffc9…;
-
-
- 命名空间:命名空间主要作用就是用来唯一定位一个标签。如果同时读取了一个或者多个相同名称的xml文件且它们中有的标签名称也有相同的情况,此时如果没有命名空间则无法唯一定位一个标签。
- xsd元素:定义校验xml格式的文件,一般需要指定要校验的命名空间和xsd文件所在地
-
- modelVersion:指定了当前pom文件的版本
- groupId:定义了当前项目属于哪个组织
- artifactId:定义了当前项目在组织中的唯一ID
- version:指定当前项目的版本,SNAPSHOT快照代表当前项目还在开发中
- name:当前项目的名称
其中
groupId、artifactId、version这三个元素定义了一个项目的基本坐标,在maven项目中任何的jar、pom都是基于这些坐标进行区分的
<project>
...
<dependencies>
<dependency>
<groupId>实际项目</groupId>
<artifactId>模块</artifactId>
<version>版本</version>
<type>依赖类型</type>
<scope>依赖范围</scope>
<optional>依赖是否可选</optional>
<!—主要用于排除传递性依赖-->
<exclusions>
<exclusion>
<groupId>…</groupId>
<artifactId>…</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
...
</project>
- dependencies:可以包含一个或者多个dependency,用于声明一个或者多个项目的依赖
- type:指定依赖类型默认为jar
- scope:指定依赖范围
- optional:标记依赖是否可选
- exclusions:排除传递性依赖
依赖范围
- compile:默认的依赖范围,表示当前依赖需要参入当前项目的编译、测试、运行周期
- test:表示依赖仅参入测试相关工作,包括测试代码的编译和运行,如junit
- runtime:表示依赖无需参与到项目的编译,不过测试和运行时需要
- provided:运行时不需要,其余编译和测试需要。运行时由别的容器提供
- system:和provided类似,但是不通过maven仓库解析,可能会造成构建不可移植
传递依赖
依赖可选
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.itwanger</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</groupId>
<version>8.4-701.jdbc3</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
依赖排除
Maven仓库
仓库指的是某个位置;该位置存放着maven项目依赖的第三方库或者插件(可统称为构件)。所有的maven项目都可以访问这个仓库,根据依赖的坐标在仓库中找到它们并使用它们
仓库的类型
- 本地仓库
- 远程仓库
-
- 中央仓库
- 私服
- 其他公共库
本地仓库
当maven文件在执行编译或者测试的时候需要使用依赖的文件,它总是基于坐标使用本地仓库的依赖文件。
默认的情况下,不管是windows、macOS、linux,每个用户都会在自己的用户目录有一个.m2/repository/的仓库目录。
如果要自定义刻在~/.m2/settings/xml中设置本地仓库的地址
远程仓库
默认情况下本地仓库会被注释,也就是说默认的仓库是空的。这种情况就必须给maven配置一个可用的远程仓库,否则maven项目在构建的时候将无法下载依赖。
中央仓库
就是这样一个可以远程拉取依赖资源的地方,里面包含了世界上绝大多数流行开源的Java类库。
但是因为中央仓库访问速度很慢所以通常会使用阿里的maven远程仓库。
<repositories>
<repository>
<id>ali-maven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
- repositories:可以包含一个或者多个repositorie元素,用来声明一个或者多个仓库
- id:仓库声明的唯一id,注意maven自带的中央仓库使用的id为central如果其他仓库也是用了该id将会覆盖中央仓库的配置
- url:指向仓库的地址
- releases和snapshots,用于控制maven对于发布版构建和快照版构建的下载权限
-
- enabled:为true是代表可以下载
- updatePolicy:用来配置maven从远处仓库检查和更新的频率
-
-
- daily默认每天一次
- never:从不检测
- always:每次构建时检测
- interval:表示每隔x分钟进行一次更新
-
-
- checksumPolicy:控制maven检测校验的策略。当maven在进行构建时报错;
-
-
- warn:默认值,在执行构建的时候输出警告信息
- fail:校验出错时直接构建失败
- ignore:让maven忽略校验
-
搭建自己的远程仓库
搭建自己的远程仓库能够方便部署自己的项目构建至远程仓库,方便其他团队成员使用,要上传构建就需要distributionManagement元素;
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
- repository:表示当前发布版本构件的仓库
- snapshotRepository:表示当前构件快照版本的仓库
两个元素都需要配置id、name、url。id为仓库的唯一表示,name方便阅读,url为仓库的位置。
配置好了以后使用命令 mvn clean deploy,maven就会将项目部署到对应的远程仓库。
仓库镜像
如果仓库X可以提供仓库Y所有的存储内容则认为X仓库是Y仓库的镜像。可以在setting.xml中添加镜像
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
其中mirrorOf元素的可选项有
- *:匹配所有远程仓库
- external:*:匹配所有远程仓库,除了本机上的远程仓库
- rep1,rep2:匹配仓库rep1、rep2,使用逗号分割多个远程仓库
- *,!rep1:匹配所有远程仓库除了rep1仓库