美文网首页
mavan开发要点总结(一)

mavan开发要点总结(一)

作者: renmen2000 | 来源:发表于2020-05-07 15:56 被阅读0次

    本文基于企业内部开发时使用到的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>
    

    相关文章

      网友评论

          本文标题:mavan开发要点总结(一)

          本文链接:https://www.haomeiwen.com/subject/ftpbwhtx.html