mavan开发要点总结(一)

本文基于企业内部开发时使用到的maven知识点总结,便于开发时查阅使用,非权威文档,仅供参考。

一、初识pom.xml

每个pom文件开头一般都有如下一段配置

    <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.pxjy.puxin.preferential</groupId>
    <artifactId>puxin-preferential</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>demo</name>
  • project pom文件顶层元素
  • modelVersion pom本身版本号一般很少变
  • groupId 项目的公司或组织一般为公司域名倒序
  • artifactId 一般指项目的唯一标志
  • version 项目版本号
  • packaging 打包方式,一般为jar或war
  • name 项目名称,一般生成项目的描述文档时需要
  • url 项目文档下载的站点url
  • description 项目描述

二、maven依赖管理基础

再上一段配置

<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.1.1</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-activemq</artifactId>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.2.62</version>
 </dependency>
 </dependencies>
1、理解maven的坐标

groupId + artifactId + version + packaging + classifier,五个维度的坐标,唯一定位一个依赖包,

实际中后面两个维度使用较少,99%的场景下groupId + artifactId + version

在pom文件的dependency标签中配置了groupId,artifactId,version后maven会自动从中央仓库或镜像仓库下载坐标对应的jar包到本地缓存中

  • 企业级坐标设置

    • groupId 一般设置为公司或组织的域名倒序www.baidu.com就是com.baidu开头

    • artfactId 某个项目、服务、模块,依据项目大小而定

    • version 版本号

    • classifier 某个项目的附属项目 如hello-world.jar的hello-world-source.jar

    • packaging jar包或war包

  • 坐标设置的意义

    • 便于依赖方定位并下载已发布的jar包
2、dependency属性详解
<dependency>
 <groupId></groupId>
 <artifactId></artifactId>
 <version></version>
 <type></type>
 <scope></scope>
 <optional></optional>
</dependency>
  • 前三项上面已做说明

  • type 一般不使用

  • scope 依赖包在不同的classpath下的作用范围,有如下几种配置

    • compile

      不配置时默认的作用范围,对test、provided、runtime三个classpath都有效

    • test

      仅对运行测试代码的classpath有用,单元测试依赖的包使用,如junit

    • provided

      对编译和测试的classpath有效,线上运行时不需要,如servlet-api,在线上运行时一般web容器会自带,所以不需要

    • runtime

      对测试和运行的classpath有效,编译的时候不需要,如jdbc驱动包,测试和运行的时候需要访问,但编译的时候是基于javax.sql包下的标准接口编译

    • optional

      true 依赖不向上传递,默认是传递不用设置,详见下边说明

依赖传递和依赖调解
  • maven依赖的传递性

    自动递归解析并下载每个包及其依赖包的依赖,不管依赖有多少层级

  • 依赖范围对于依赖传递的影响

    下面的表格详细列出了影响,第一列是一级依赖,第一行是二级依赖,依赖范围对依赖传递产生影响

    compile test provided runtime
    compile compile runtime
    test test test
    provided provided provided provided
    runtime runtime runtime
  • 依赖调解

    • 产生原因

      由于循环依赖,自动下载依赖包,可能导致下载到同一个包的不同版本,可能会产生冲突

    • maven解决依赖冲突的机制——依赖调解

      • 短路径优先原则

        如:A-B-C-X1.0和A-D-X2.0,此时判断A-D-X2.0路径段,使用X2.0

      • 申明优先选择

        如:A-B-X1.0,A-D-X2.0,此时从pom中<dependency>标签判断谁配置靠前使用谁的依赖

  • 可选依赖(补充)

    补充说明dependency标签的optional属性,一般不用设置,如果特殊情况下需要阻止依赖传递,则可手动设置为true,这个也使用的比较少

  • 依赖冲突解决

    • 产生原因

      由于依赖传递+依赖调解导致有时候可能会依赖到不正确的版本(一般是低版本的包)

    • 解决办法

      • 使用mvn depedency:tree命令查看项目依赖树,也可以使用IDE工具查看版本依赖

      • 找到包问题的包依赖的jar版本,查找正常情况下应该依赖的版本

      • 手动排除掉当前依赖的低版本包,此时会自动依赖高版本包

        注意需要在依赖低版本的jar包里排除掉

        如:A-D1.0、B-C-D2.0此时需要在A包里排除,具体的排除语法如下

        <dependency>
        <groupId>A</groupId>
        <artifactId>A</artifactId>
        <version>1.0</version>
        <exclusions>
              <exclusion>
                  <groupId>D</groupId>
                  <artifactId>D</artifactId>
              </exclusion>
        </exclusions>
        </dependency>
        

三、理解maven的各级仓库及配置

maven1.PNG
1、本地仓库
    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 | The path to the local repository maven will use to 
        store artifacts. | | Default: ${user.home}/.m2/repository -->
    <localRepository>C:\Users\renpb\.m2\repository</localRepository>

在maven自己的settings.xml文件中指定,windows系统中一般配置在用户目录.m2\repository

2、内网私服

公司内部使用nexus搭建的一套服务,便于集中下载和管理jar包以及将自己开发的共用jar发布到私服供其他团队使用,管理内网私服下面单独做更详细的讲解

3、中央仓库

maven的jar包里自带一个超级pom,里面默认配置了一个中央仓库,如果不做任何设置,拉取依赖包时就会从该超级pom配置的中央仓库去下载

<repositories>
    <repository>
        <id>central</id>
        <name>Maven Repository Switchboard</name>
        <url>http://repo1.maven.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
4、其他仓库

某些厂商的jar并没有在maven中央仓库提供,此时需要从厂商自己提供的地址去下载,需要注意

5、镜像仓库

由于maven中央仓库服务器在国外,有时候下载依赖会非常慢,国内部分大厂提供镜像仓库,里边存放与中央仓库一模一样的资源,代理中央仓库,满足国内用户快速下载需求,一般都使用阿里云镜像仓库

一般配置在settings.xml里,配置如下,注意如果有内网私服可能会将镜像仓库直接配置在私服里,本地统一走私服即可

<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。