1,本地仓库与远程仓库
Maven 仓库的分类:
1.本地仓库
2.远程仓库,
在远程仓库中又分成了3种:
2.1 中央仓库
2.2 私服
2.3 其它公共库
1.本地仓库,顾名思义,就是Maven在本地存储构件的地方。
注:maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建
maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置
如何更改maven默认的本地仓库的位置:这里要引入一个新的元素:localRepository,它是存在于maven的settings.xml文件中
1.1 更改配置用户范围的本地仓库:先在/.m2/目录下创建settings.xml文件,然后在~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址
<settings>
<localRepository>D:\maven_new_repository</localRepository>
</settings>
这时候,maven的本地仓库地址就变成了 D:\maven_new_repository ,注:此时配置的maven的本地仓库是属于用户范围的。
1.2 更改配置全局范围的本地仓库:在M2_HOME/conf/settings.xml中更改配置,更改配置的方法同上
注:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份M2_HOME/conf/settings.xml文件
故:一般情况下不推荐配置全局的settings.xml
2.1 说到远程仓库先从 最核心的中央仓库开始,中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置
在maven的聚合与继承中我们说过,所有的maven项目都会继承超级pom,具体的说,包含了下面配置的pom我们就称之为超级pom
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2,私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
Maven私服的 个特性:
1.节省自己的外网带宽:减少重复请求造成的外网带宽消耗
2.加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低
3.部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用
4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能
5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力
当前主流的maven私服:
1.Apache的Archiva
2.JFrog的Artifactory
3.Sonatype的Nexus
3,GAV坐标
Maven坐标是用唯一标示我们的某一构件的,它主要由GroupId/ArtifactId/Version
三点构成。
项目 | 解释 |
---|---|
GroupID | 组织机构/顶层项目 |
ArtifactID | 项目/库 |
Version | 唯一发行版本号 |
坐标查找:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmMQai0m-1617710562972)(assets/1617674458788.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10ypO0wG-1617710562976)(assets/1617674496313.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PUkSd6P-1617710562979)(assets/1617674526310.png)]
4,镜像仓库
settings.xml 示例:
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
id 表示镜像的唯一标识符(可自定义)
name 表示镜像的名称(可自定义)
url 表示镜像的地址
mirrorOf 表示向center中央仓库请求都会重定向到阿里巴巴的仓库中,也可配置成*号,表示所有请求都重定向到阿里巴巴的仓库中
5,项目对象模型(POM)
Maven 有两个很重要的配置文件,一个全局配置文件 settings.xml,另一个是 pom.xml(项目对象模型)。
每一个Maven项目都包含一个pom文件,该文件用于配置当前Maven项目的坐标信息,打包方式,属性,相关依赖,插件,仓库等配置信息,因此它是项目级别的配置文件。
5.1 modelVersion
pom的版本,为了确保隐私,这个元素是强制性的。除非Maven开发团队升级pom的版本,否则不需要修改。
pom.xml 示例:
<modelVersion>4.0.0</modelVersion>
5.2 当前项目的GAV坐标
pom.xml 示例:
<!-- 组织名称-->
<artifactId>maven-demo-parent</artifactId>
<!-- 项目名称-->
<groupId>org.example</groupId>
<!-- 版本号-->
<version>1.0-SNAPSHOT</version>
5.3 打包方式
pom.xml 示例:
<!-- 打包为war文件-->
<packaging>war</packaging>
<!-- 打包为jar文件-->
<packaging>jar</packaging>
5.4 属性配置
1. 内置属性
pom.xml 示例:
<properties>
<!-- 设置java的版本为1.8 -->
<java.version>1.8</java.version>
<!-- 源码编译的版本为1.8 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 目标字节码的版本为1.8 -->
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 设置项目的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 指定编译器版本为1.8 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
2. 自定义属性
pom.xml 示例:
<properties>
<!-- druid version-->
<druid.version>1.1.22</druid.version>
<!-- dbutil version-->
<dbutil.version>1.6</dbutil.version>
<!-- mysql version-->
<mysql.version>8.0.23</mysql.version>
<!-- servlet version-->
<servlet.version>3.1.0</servlet.version>
<!-- jstl version-->
<jstl.version>1.2</jstl.version>
</properties>
5.5 依赖配置
pom.xml 示例:
<dependencyManagement>
<dependencies>
<!-- druid 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- dbutils 依赖 -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>${dbutil.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
5.6 添加到远程仓库
pom.xml 示例:
<repositories>
<repository>
<!-- 仓库的唯一标识 -->
<id>public</id>
<!-- 仓库名称 -->
<name>Public Repositories</name>
<!-- 仓库的 url -->
<url>http://xxx.xx.xxx.xxx:xxxx/repository/maven-public/</url>
<!-- 允许拉取已发布的稳定版本 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 不拉取快照版本 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
说明:
releases 表示已发布的版本,即稳定版本,这里设置为true表示允许远程仓库拉取稳定版本的库,snapshots 表示快照,即不稳定的版本,这里设置为false,表示禁止使用快照仓库。
5.7 发布到远程仓库
pom.xml 示例:
<distributionManagement>
<!-- 发布仓库 -->
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://xxx.xx.xxx.xxx:xxxx/repository/maven-releases/</url>
</repository>
<!-- 快照仓库 -->
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://xxx.xx.xxx.xxx:xxxx/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
说明:
repository为发布稳定版本的仓库,snapshotRepository 为不稳定的快照仓库。id 为仓库的唯一标识(可任意命名),url 为仓库地址(这里使用自行搭建的Nexus私服)。通常为了安全起见,会为私服的仓库设置相应的账号密码,那么还需要在 settings.xml 中的servers元素中配置仓库的账号。
settings.xml 示例:
<servers>
<!-- server 中的id必须和pom文件中 repository 的id一致 -->
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
server 中的 id 必须和 distributionManagement 中 repository 的 id 保持 一致。username 和 password 对应的仓库设置的账号密码。
6,Maven依赖管理
Maven 的依赖过程中还包括 依赖的传递,依赖的优先级别,排除依赖,可选依赖,及依赖范围等特点。
6.1 依赖传递性
项目中只配置了A,而A又依赖了B,B又依赖了C,那么项目就间接依赖了B和C
6.2 依赖传递的优先级别
当出现依赖同一个项目时,优先选择最短路径的依赖,如果路径长度相同,则按照配置顺序选择最前的进行依赖。
6.3 依赖排除
设A依赖B,B依赖C
现在想排除A对C的间接依赖
1.可选依赖
使用<optional>true</optional>
不让C传递
<dependency>
<groupId>C</groupId>
<artifactId>C</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
2.依赖排除
依赖后用 <exclusions>
排除
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>C</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
6.4 可选依赖
使用<optional>true</optional>
不让C传递
<dependency>
<groupId>C</groupId>
<artifactId>C</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
6.5 依赖范围
依赖范围表示依赖的项目在哪些情况下需要存在,由依赖配置中的 <score>
决定。
pom.xml 示例:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<!-- 指定依赖的作用范围 -->
<scope>provided</scope>
</dependency>
在定义项目的依赖项的时候,我们可以通过scope来指定该依赖项的作用范围。scope的取值有compile(编译)、runtime(运行时)、test(测试)、provided(提供者)、system(系统)。如果不指定,默认为compile。
范围 | 说明 |
---|---|
compile | 在编译,测试,运行时都需要 |
test | 测试时需要,编译和运行不需要(例如:Junit) |
runtime | 测试和运行时都需要,编译不需要(例如:JDBC驱动) |
provided | 编译和测试时需要,运行时不需要,由运行环境提供(例如:servlet-api) |
system | 本地依赖,不在maven中央仓库 |