mavan开发要点总结(一)

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

一、初识pom.xml

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

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

二、maven依赖管理基础

再上一段配置


 
 org.springframework.boot
 spring-boot-starter-web
 
 
 org.mybatis.spring.boot
 mybatis-spring-boot-starter
 2.1.1
 
 
 org.springframework.boot
 spring-boot-starter-activemq
 
 
 mysql
 mysql-connector-java
 runtime
 
 
 org.projectlombok
 lombok
 true
 
 
 
 com.alibaba
 fastjson
 1.2.62
 
 
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属性详解

 
 
 
 
 
 

  • 前三项上面已做说明

  • 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标签的optional属性,一般不用设置,如果特殊情况下需要阻止依赖传递,则可手动设置为true,这个也使用的比较少

  • 依赖冲突解决

    • 产生原因

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

    • 解决办法

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

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

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

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

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

        
        A
        A
        1.0
        
              
                  D
                  D
              
        
        
        

三、理解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">
    
    C:\Users\renpb\.m2\repository

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

2、内网私服

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

3、中央仓库

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


    
        central
        Maven Repository Switchboard
        http://repo1.maven.org/maven2
        default
        
            false
        
    

4、其他仓库

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

5、镜像仓库

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

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


    
        nexus-aliyun
        *
        Nexus aliyun
        http://maven.aliyun.com/nexus/content/groups/public
    
  

你可能感兴趣的:(mavan开发要点总结(一))