一. Maven项目的基本结构
上一章,我们创建了一个简单的 Jar类型的项目,发现这个项目的目录结构是这样的。
如果我们创建一个 web 类型的项目, 会发现这个项目相比较 jar类型的项目,多了一个webapp 选项。
这个 webapp 下需要创建 WEB-INF 和 META-INF 目录,来存放相应的信息,如 web.xml和 js,css文件。
在创建项目时,一定要遵守这些规则,这些约定,只有符合这样约定的结构,才属于Maven 结构,才能 约定优于配置
二. Maven的仓库 (repository)
Maven的仓库,指的就是存放 jar包的地方。 分为两类,一类是本地仓库,另外一类是 远程仓库。 而远程仓库里面,又可以分成 中央仓库,私服,和其他公共库。
二.一 Maven的本地仓库
Maven的本地仓库,默认的路径为 用户/.m2/repository/ 目的,也可以通过 settings.xml 文件的 <localRepository> 标签进行配置。
二.二 Maven的中央仓库
Maven的中央仓库,由 Maven的开发团队进行相应的维护, 下载jar包时,就是从 Maven的中央仓库进行相应的下载。
网址是: http://repo1.maven.org/maven2/
但由于该网站在外国,访问速度慢,故常常配置其镜像。 国内常用,阿里云镜像。
中央仓库的配置文件路径在 : M2_HOME/lib/maven-model-builder-3.5.4.jar 里面。
将其 jar包进行反编译, 在 org/apache/maven/model/pom-4.0.0.xml 文件
在最开始的地方,有
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
二.三 镜像 mirror
镜像是一种数据冗余, 是一个磁盘上的数据在另外一个磁盘上存在完全相同的一个副本,就叫镜像。 镜,就是镜子,完全一样。
为什么要使用镜像:
1 . 你有的我都有,你没有的我也有。(拥有中央仓库所有的jar包,并且还有一些中央仓库没有的jar包)
2 . 我跑的比你快 (中央仓库在外国,访问速度过慢,而国内的阿里云镜像在国内,访问速度和下载速度快)
故 常常配置镜像来替代 中央仓库。 国内选用阿里云镜像。 关于阿里云镜像的配置,老蝴蝶在上一章已经讲过了。
二.四 私服 (profile)
私服,相当于局域网内部的仓库,如部门级别的私服和公司级别的私服, 可以用 Nexus 来配置。
如果配置了私服,那么会优先去私服下载 jar包,如果私服没有,则再去镜像或者中央仓库下载,下载之后,保存一份到私服。
私有的优点有:(说法比较官方,就用 那个 ShenWenFang 前辈的话了)
1.节省外网宽带
2.加速Maven构建
3.部署第三方构件:可以将公司项目的 jar 发布到私服上,方便项目与项目之间的调用
4.提高稳定性、增强控制:原因是外网不稳定
5.降低中央仓库的负荷:原因是中央仓库访问量太大
二.五 优先级
Maven下载jar包的优先级:
1.如果本地仓库有,就从本地仓库里拿
2.如果本地仓库没有,就从私服拿,顺便下载一份到本地仓库(如果有私服的话)
3.如果私服没有,判断是否配置了镜像,如果配置了镜像,就去镜像那儿拿,如果没有没有配置镜像,就从中央仓库那拿。
4.如果中央仓库也没有,就抛出异常,坐标不对。
所以, Maven的各个仓库的优先级是:
本地仓库 > 私服 > 远程仓库
三. 坐标 (coordinates)
无论是从本地仓库引用jar包,还是从远程仓库下载jar包, 该怎么下载呢,或者是如何告诉仓库,你要使用的是哪个 jar包呢? 在自然界,我们用经纬坐标来表示自己的位置,数学界用 横纵坐标来表示点的位置, 所以 下载jar包时,也是用坐标来表示 jar包。
jar包的坐标需要三部分组成, 一个是 groupId, 一个是 artifactId, 一个是 versionId .
groupId 表示公司/组织名, 常常用 域名反写,如 阿里巴巴 是 com.alibaba
artifactId 表示项目名, 哪个项目,如 fastjson
version 表示版本号, 如 1.2.15
那么 com.alibaba.fastjson-1.2.15.jar 就可以表示出 阿里巴巴公司的fastjson项目 1.2.15版本的jar包了。
表示在 Maven中,坐标就可以写成:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency>
在我们自己创建 jar项目时,也相应的制定了我们自己 jar包的坐标了, 在创建Maven项目时指定的
如上一章节我们创建的 Jar项目
groupId 为 com.yjl
artifactId 为 HelloMaven
version 版本 为 0.0.1-SNAPSHOT
其他项目在引入 HelloMaven, 如里面的 Hello.java 类时, 只需要
<dependency> <groupId>com.yjl</groupId> <artifactId>HelloMaven</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
即可以引入相应的 HelloMaven的jar包了。
其中, SNAPSHOT 为快照的意思,是测试版本,区别于 releases 正式版。