# Maven-依赖管理

🐴

# 引入依赖

我们在开发时,需要可能需要依赖很多jar包,这时我们可以使用Maven来管理我们的项目依赖

# 引入外部依赖

Maven中我们使用外部依赖主要用的下面元素:

  • dependency 项目的依赖配置元素
  • groupId 组织ID
  • artifactId 项目ID
  • version 项目版本

例如我们引入一个ldapjdk jar

<dependencies>
    <dependency>
      <groupId>ldapjdk</groupId>  <!-- 库名称,也可以自定义 -->
      <artifactId>ldapjdk</artifactId>    <!--库名称,也可以自定义-->
      <version>1.0.0</version> <!--版本号-->
    </dependency>
</dependencies>

# 依赖关系

在引入依赖时,我们可以设置依赖的作用域。设置依赖作用域通过scope元素来设置。Maven定义了下面几种作用域

scope 描述
compile 编译时需要用到该jar包(默认)
test 编译Test时需要用到该jar包,如JUnit
runtime 编译时不需要,但运行时需要用到,如MySQL驱动
provided 编译时需要用到,但运行时由JDK或某个服务器提供,如servlet api

Maven默认引入依赖时是在compile编译阶段。下面是在runtime运行时引入MySQL驱动

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
    <scope>runtime</scope>
</dependency>

# 仓库类型

Maven中的仓库指的是项目中依赖的库所在的位置,一般这个位置有三个:

  • 本地仓库
  • 中央仓库
  • 私服仓库

# 本地仓库

Maven在安装后,并第一次执行Maven命令时会创建一个本地仓库。默认情况下,Mave的本地仓库地址为${user.home}/.m2/repository

我们可以在Maven根目录的conf/settings.xml中修改该默认仓库

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
   http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository>D:/MyLocalRepository</localRepository>
</settings>

上面配置将Maven的本地仓库修改为了D:/MyLocalRepository

# 中央仓库

Maven提供了一个中央仓库。开发者可以将开发好的库上传以供其他人使用。使用Maven中央仓库时不需要配置,但是需要网络进行连接下载(国内连接Maven中央仓库不稳定,我们可以配置阿里镜像,下面有介绍)。Maven社区还提供了查询中央仓库内容的网站 https://search.maven.org/#browse (opens new window)

# 私服仓库

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。

配置私服仓库可以使用repositories元素,在该元素下使用repository元素可以配置多个私服仓库。方式如下

<repositories>  
  <repository>  
    <id>jboss</id>  
    <name>JBoss Repository</name>  
    <url>http://repository.jboss.com/maven2/</url>  
    <releases>  
      <!-- 表示更新的频率,值有:never, always,interval,daily, daily 为默认值 -->
      <updatePolicy>daily</updatePolicy>
      <enabled>true</enabled>  
      <!-- 表示maven检查和检验文件的策略,warn为默认值 -->
      <checksumPolicy>warn</checksumPolicy>
    </releases>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
    <layout>default</layout>  
  </repository>  
</repositories>

# 安全认证

出于安全方面的考虑,有时我们要对远程仓库的访问进行认证,一般将认证信息配置在settings.xml中:

<servers>  
  <server>  
    <id>same with repository id in pom</id>  
    <username>username</username>  
    <password>pwd</password>  
  </server>  
</servers>

# 阿里镜像

由于国内访问Maven中央仓库较慢,我们有两种方法可以配置阿里镜像

  1. 我们在Maven所安装的根目录conf/settings.xml中来配置
<mirrors>
  <mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
  </mirror>
</mirrors>
  1. 第二种方法是我们在POM文件中配置
<repositories>
  <repository>
      <id>maven-ali</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>

# 继承

项目中的Pom.xml可以继承父PomMaven 继承的存在是为了消除重复配置。Maven的继承如下:

  • POM通过 parent元素来指定继承的父POM

  • Maven里的dependencyManagementpluginManagement元素用于帮助POM继承过程中的依赖管理和插件管理。在父类POM下,此两个元素中的声明的依赖或配置并不会引入实际的依赖或是造成实际的插件调用行为,不过它们能够约束子类POM中的依赖和插件配置的声明。在子POM下需要手动引入

  • Maven里父POMdependencies里的元素,在子POM继承时,会自动引入相关依赖

父Pom.xml

<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>
    
    <!-- 父Pom 的信息 -->
    <groupId>com.lesson</groupId>
    <artifactId>Parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <name>test-project</name>

   <!-- 
      这种配置,不需要子项目手动引入。依赖会在子项目中自动引入
      适合项目的开发
     -->
    <dependencies>
      <dependency>
          <groupId>org.myco.myplugins</groupId>
          <artifactId>myplugin</artifactId>
          <version>1.0.0</version>
      </dependency>
    </dependencies>

   <!-- 
     dependencyManagement 里的依赖,子项目需要手动引入
     只是限定了依赖的版本信息。适合框架开发
    -->
    <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.0</version>
              <scope>compile</scope>
          </dependency>
      </dependencies>
   </dependencyManagement>

</project>

子Pom.xml 继承方式如下

<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>

    <!-- 子Pom的信息 -->
    <groupId>com.children</groupId>
    <artifactId>child</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

   <!-- 
     继承父类及其定义的版本信息
     这里会自动继承 org.myco.myplugins myplugin
    -->
    <parent>
        <groupId>com.lesson</groupId>
        <artifactId>Parent</artifactId>
        <version>1.0.0</version>
    </parent>
   <!-- 
     在子项目中 引入父dependencyManagement 里的依赖,子项目需要手动引入
     不用指定版本号。子项目会继承父项目的版本号
    -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>

参考文献

最近更新时间: 7/2/2021, 11:27:27 AM