你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Maven的个人理解

2021/12/26 15:10:17

maven

它是什么

一个包管理器,对于一个java web 项目来说,常需要大量的第三方包,那么maven 就能够提供一个导入第三方包的服务,同时解决了一些第三方包冲突的问题,第三方包在maven 项目中也称为依赖,一下统称第三方包为依赖

第三方包是什么呢?

是一个经过打包的jar 文件,可以理解为一个提供了一些功能的“java文件”压缩包。

为什么要达成jar 包?

方便管理,一个jar 包提供某项功能
保护源码,可以在打包时加入混淆逻辑,使对方只能够使用其服务,而不能获得其服务的源码,常用于付费服务

pom.xml

maven 项目最常用的就是pom文件,对项目上的依赖的修改只需要改动这个文件即可

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <groupId>com.XXX</groupId>
        <artifactId>XXX-parent</artifactId>
        <version>1.2.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

	<groupId>com.XXX</groupId>
    <artifactId>XXX</artifactId>
    <name>XXX</name>

    <dependencies>
        <!-- 依赖服务列表 -->
        <dependency>
            <groupId>com.XXX</groupId>
            <artifactId>XXX</artifactId>
            <version>1.2.1-SNAPSHOT</version>
        </dependency>

        <!-- 德邦MQ客户端依赖 -->
        <dependency>
            <groupId>com.XXX.XXX</groupId>
            <artifactId>XXX-X-XXX</artifactId>
            <version>1.0.4</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>XXX-releases</id>
            <name>XXX Releases Repository</name>
            <url>http://XXX.cn</url>
        </repository>
    </repositories>

</project>

丛上往下pom 文件依次分为

  • parent
    · 用于定义该pom 文件依赖于哪一个文件,当多个pom 项目共有同一种特征,都引入某些依赖的时候,就可以将这些共性抽离成一个父项目,然后其他项目就可以不引入那些重复的依赖,只需要定义父项目就可以
    具体使用

    1. groupId:可以看到,在parent 里面和外边都有这个标签,它的作用就是标识组织。想一想maven 作为广泛使用的工具,jar 包又有成千上万个,如果不能有效地区分不同包,当你需要A包,maven 给你提供了一个同名的B包,这样的工具显然是失败的。groupId 的规则就是编写这个maven 项目的公司的网站的域名反写
      比如,阿里巴巴的官网alibaba.com
      alibaba.com
      那么阿里巴巴所开发的项目的groupId 就是com.alibaba
      在这里插入图片描述

    2. artifactId 是项目的名称,一般是项目经理规定好,对于自己的项目叫阿猫阿狗也没人管你,能区分开就好

    3. version 一个项目正常来说需要不断地更新迭代,新的版本更新旧的版本也必须要存在,因为如果有另外的项目引入了旧版本的依赖,如果删掉了旧版本会导致其他的项目发生莫名其貌的问题,所以用version 区分发布的不同版本
      通过以上三个标签就能够准确定位到一个依赖,在parent 中声明说明是其依赖继承了parert 项目中的依赖,而在parent 标签外定义的作用是:能够让其他项目准确定位到自己

  • modelVersion 是maven 模型的的版本,默认就写4.0.0

  • name 是给人类看的,可以随便定义

  • dependencies 是 dependency 的父标签,dependency 外面都必须有一层dependencies嵌套

  • dependency 核心标签,声明需要的依赖

    1. 当你某天收到了一个需求:需要解析json文件,恰巧的是原有的工具包又不足以满足需求,你又得知alibaba有一个库叫fastjson能很快捷的实现这个需求

    2. 去mvn 仓库找到 fastjson 的依赖
      fastjson
      在这里插入图片描述

      可以看到在项目上已经能够调用fastJson提供的包fastjson in use

    3. depandancy 里面的内容不建议手写,除非你已经能够非常自信的知道自己需要的依赖的groupId artifactId 和 version 信息

  • repositories 设置依赖的仓库地址,在里面可以设置若干个子标签repository 意味着你可以设置多个仓库

    1. 仓库是什么?
      · 首先设想一下,如果不设置仓库会依赖要从哪里下载,一定是每一家公司单独设置一个服务器,然后指定每一个你需要的依赖的下载url,麻烦而且没有一个统一的规范。
      · 真正的使用场景:大家遵循一个规范,将自家的依赖都放到这个仓库上面,对于其他的使用这类来说只需要定义这个仓库的地址,然后让maven 自己去判断要下载哪个依赖
      · maven 有两个中心仓库,但是在国内下载速度十分堪忧,通常会指定一个镜像仓库
      · 通常情况下你不需要在设置仓库地址,因为常用的依赖都能中心仓库或者镜像仓库中找到,但是对于某些公司的内部项目来说,将自己的核心包没必要也不应该公开放在中心仓库,所以他们会搭建私服仓库,你作为内部项目的开发者你需要设置私服仓库地址,下载内部依赖

目录结构

  • 尽管maven 对依赖包进行管理,但是你仍然需要知道它在你电脑里面的存储位置
    1. 通常会创建一个.m2 的文件夹
    C:\Users\Administrator.m2
    在这里插入图片描述
    .m2 文件下的repository 是maven 下载的依赖,settings.xml 是maven 的配置文件,前文说到的配置镜像仓库地址就是在settings.xml 里面进行配置的
    在这里插入图片描述
  1. repository 存储每个现在的依赖,依赖的存储位置就是groupId + artifactId + version
    对于fastjson 依赖来说,它相对于repository 来说理论的存储路径就是
    /com/alibaba/fastjson/1.2.78
    在这里插入图片描述
    在这里插入图片描述
    进入·artifactid 后显示的是版本信息,找到对应的版本
    在这里插入图片描述
    找到了我们需要的jar ,撒花
  2. 至此可以理解为什么对于groupId 的规范是公司域名的反写,可以使目录更清晰,简化maven 找包时的时间复杂度

常见问题

  • 依赖飘红
    1. 依赖没有下载成功,常见是网络问题,下载中断导致的,因为下载了但是没下载完全,在.m2/repository 中找到对应的文件删掉,然后重新下载即可,见第5条。

    2. 检查是否正确设置了镜像仓库

    3. 有时候编译器(IDEA)会抽风,关闭重新打开项目

    4. 修改后依赖要加载一遍pom,它不会主动加载改变
      在这里插入图片描述

    5. 重新加载pom,个人认为IDEA 的maven 插件的Reload project 不怎么好用
      在这里插入图片描述
      首选还是在这里插入图片描述
      找不到这个图标时
      在这里插入图片描述
      在这里插入图片描述
      任意输入一个字符,然后加载改变,之后再删掉字符就能后再次加载