Maven 学习笔记

参考文章:maven到底是个啥玩意~

What is Maven?

Maven 是 Apache 下的一个纯 Java 开发的开源项目,简单来说是一个项目管理工具,核心功能是合理叙述项目间的依赖关系。

Maven java项目结构

simple
 —pom.xml    核心配置,项目根下
 —src
  —main      
    —java    java源码目录
    —resources  java配置文件目录
  —test
   —java    测试源码目录
   —resources  测试配置目录

图中有一个target目录,是因为将该java项目进行了编译,src/main/java下的源代码就会编译成.class文件放入target目录中,target就是输出目录。

POM.xml

POM.xml( Project Object Model,项目对象模型 ) 是Maven工程的基本工作单元,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包。

所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>

<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>

<!-- 版本号 -->
<version>1.0</version>
</project>
节点 描述
project 工程的根标签。
modelVersion 模型版本需要设置为 4.0。
groupId 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织com.companyname.project-group 拥有所有的和银行相关的项目。
artifactId 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。
version 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。
### 如何通过pom.xml文件获取到想要的jar包?

###为什么通过groupId、artifactId、version三个属性就能定位一个jar包?

加入上面的pom.xml文件属于A项目,那么A项目肯定是一个maven项目,通过上面这三个属性能够找到junit对应版本的jar包,那么junit项目肯定也是一个maven项目,junit的maven项目中的pom.xml文件就会有三个标识符,比如像下图这样,然后别的maven项目就能通过这三个属性来找到junit项目的jar包了。所以,在每个创建的maven项目时都会要求写上这三个属性值的。

如何获得groupId这些字段呢?

一般而言,如果官方项目支持Maven,在其页面一般会有一段依赖字段以供复制,但也确实存在支持Maven但没有给出依赖字段的情况。而另一些项目的Maven特性由第三方维护,此时从官方渠道获得对Maven的支持比较困难。
因此,查询依赖字段首选的方案,是使用Maven搜索服务进行搜索。这里推荐一个地址:mvnrepository.com

##Maven 仓库
通过pom.xml中的配置,就能够获取到想要的jar包(还没讲解如何配置先需要了解一下仓库的概念),但是这些jar是在哪里呢?就是我们从哪里获取到的这些jar包?答案就是仓库。仓库有三类:

  1. 本地仓库 (local)
  2. 远程仓库 (remote)
  3. 1 中央仓库 (默认的远程仓库)
  4. 2 私服 (一般是公司内部自己设置的)
  5. 其他公共库 (e.g. 阿里云的仓库)

获取jar包时,优先从本地仓库查找,如果本地仓库中没有且配置了私服的话,就从私服中找,如果还没有就从中央仓库中获取,并下载到本地仓库。