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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352