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 项目共有同一种特征,都引入某些依赖的时候,就可以将这些共性抽离成一个父项目,然后其他项目就可以不引入那些重复的依赖,只需要定义父项目就可以
-
groupId:可以看到,在parent 里面和外边都有这个标签,它的作用就是标识组织。想一想maven 作为广泛使用的工具,jar 包又有成千上万个,如果不能有效地区分不同包,当你需要A包,maven 给你提供了一个同名的B包,这样的工具显然是失败的。groupId 的规则就是编写这个maven 项目的公司的网站的域名反写
比如,阿里巴巴的官网alibaba.com
那么阿里巴巴所开发的项目的groupId 就是com.alibaba
-
artifactId 是项目的名称,一般是项目经理规定好,对于自己的项目叫阿猫阿狗也没人管你,能区分开就好
-
version 一个项目正常来说需要不断地更新迭代,新的版本更新旧的版本也必须要存在,因为如果有另外的项目引入了旧版本的依赖,如果删掉了旧版本会导致其他的项目发生莫名其貌的问题,所以用version 区分发布的不同版本
通过以上三个标签就能够准确定位到一个依赖,在parent 中声明说明是其依赖继承了parert 项目中的依赖,而在parent 标签外定义的作用是:能够让其他项目准确定位到自己
-
-
modelVersion 是maven 模型的的版本,默认就写4.0.0
-
name 是给人类看的,可以随便定义
-
dependencies 是 dependency 的父标签,dependency 外面都必须有一层dependencies嵌套
-
dependency 核心标签,声明需要的依赖
-
当你某天收到了一个需求:需要解析json文件,恰巧的是原有的工具包又不足以满足需求,你又得知alibaba有一个库叫fastjson能很快捷的实现这个需求
-
去mvn 仓库找到 fastjson 的依赖
可以看到在项目上已经能够调用fastJson提供的包
-
depandancy 里面的内容不建议手写,除非你已经能够非常自信的知道自己需要的依赖的groupId artifactId 和 version 信息
-
-
repositories 设置依赖的仓库地址,在里面可以设置若干个子标签repository 意味着你可以设置多个仓库
- 仓库是什么?
· 首先设想一下,如果不设置仓库会依赖要从哪里下载,一定是每一家公司单独设置一个服务器,然后指定每一个你需要的依赖的下载url,麻烦而且没有一个统一的规范。
· 真正的使用场景:大家遵循一个规范,将自家的依赖都放到这个仓库上面,对于其他的使用这类来说只需要定义这个仓库的地址,然后让maven 自己去判断要下载哪个依赖
· maven 有两个中心仓库,但是在国内下载速度十分堪忧,通常会指定一个镜像仓库
· 通常情况下你不需要在设置仓库地址,因为常用的依赖都能中心仓库或者镜像仓库中找到,但是对于某些公司的内部项目来说,将自己的核心包没必要也不应该公开放在中心仓库,所以他们会搭建私服仓库,你作为内部项目的开发者你需要设置私服仓库地址,下载内部依赖
- 仓库是什么?
目录结构
- 尽管maven 对依赖包进行管理,但是你仍然需要知道它在你电脑里面的存储位置
1. 通常会创建一个.m2 的文件夹
C:\Users\Administrator.m2
.m2 文件下的repository 是maven 下载的依赖,settings.xml 是maven 的配置文件,前文说到的配置镜像仓库地址就是在settings.xml 里面进行配置的
- repository 存储每个现在的依赖,依赖的存储位置就是groupId + artifactId + version
对于fastjson 依赖来说,它相对于repository 来说理论的存储路径就是
/com/alibaba/fastjson/1.2.78
进入·artifactid 后显示的是版本信息,找到对应的版本
找到了我们需要的jar ,撒花 - 至此可以理解为什么对于groupId 的规范是公司域名的反写,可以使目录更清晰,简化maven 找包时的时间复杂度
常见问题
- 依赖飘红
-
依赖没有下载成功,常见是网络问题,下载中断导致的,因为下载了但是没下载完全,在.m2/repository 中找到对应的文件删掉,然后重新下载即可,见第5条。
-
检查是否正确设置了镜像仓库
-
有时候编译器(IDEA)会抽风,关闭重新打开项目
-
修改后依赖要加载一遍pom,它不会主动加载改变
-
重新加载pom,个人认为IDEA 的maven 插件的Reload project 不怎么好用
首选还是
找不到这个图标时
任意输入一个字符,然后加载改变,之后再删掉字符就能后再次加载
-