2.Maven 仓库与依赖管理

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

  1. 远程仓库

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唯一发行版本号

坐标查找:

https://mvnrepository.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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中央仓库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值