Maven的基本概念(三)

古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。

上一章简单介绍了Maven与Eclipse的整合和简单的Maven项目(二),如果没有看过,请观看上一章

第二章仓库的部分,参考了 ShenWenFang 前辈的文章: https://swenfang.github.io/2018/06/03/Maven-Priority/

一. 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 正式版。

四. 快照(SNAPSHOT)

SNAPSHOT 快照,是测试版本,区别于releases 正式版, 一个项目jar包最后被完成了,那么需要发布的是正式版,或者是一个大的版本改动,如2.0 版本完成了,那么就是正式版, 在结束之前的,如2.0.1.1,2.0.1.2都是测试版本。 如老蝴蝶创建两个项目, 一个是项目A, 一个是项目B, 其中项目B需要引用项目A中的类, 即把A的Jar包放置到B里面, 但是现在项目A和项目B都是在开发中的, 代码都是随时会变的。 传统的做法是, 将目前的A打包成一个 jar,放到B里面,B进行调用。 如果A代码发生了改变,需要将A重新打包,通知B,并且将新的Jar包发送给B,B进行替换,然后再重新调用。 这样是很麻烦的。 如果用Maven的话, 将A的版本设置成快照 snapshot 版本,B直接进行项目的引用,记录一下,现在的时间戳 当A代码发生改变时,重新打包,记录一下现在的时间戳 然后B调用时,会检查一下时间戳,使用最近时间的那个, 不用再重新替换Jar包了。

五. Maven的 packaging 类型

上一章在创建Maven项目时,在选择 packaging 时,选择创建的是 Jar类型。 其实,除了 Jar 类型,之外,还有其他的两种类型: pom 和war.


这三种,对应的是 Java项目的三种不同形态。

普通的Java 项目,选择的是 Jar类型,最后打包成 .jar 文件。

Web动态项目, 选择的是 war 类型,最后打包成 .war 文件。 将.war 文件放置在 tomcat里面,tomcat会将其自动解压运行。

父项目,选择的是 pom 类型。 即,不同的项目,如 dao层项目需要被 service层项目引用, service层项目需要被 action层项目引用,需要区别于 dao,service 和action, 即区别于 父子项目, 常常将 dao,service 这样的父项目 定义成 pom 类型, action为正常的 war 类型。

关于 war 项目和 pom 项目的创建, 将在以后的章节进行讲解。

六. Maven的依赖坐标

在Maven 项目中,各种各样的 jar包 叫做依赖, dependency, 依赖于哪个 jar包。 关于配置JDK版本,tomcat运行版本之类的,叫做插件,是Maven的插件,由Maven提供。 如 junit4.12, fastjson-1.2.15 叫做 依赖。 通常,我们引用一个 jar包,如果进行引用呢? 是通过坐标进行引用, 可怎么能记录那些坐标呢?
将其放置在 <dependencies></dependencies> 标签里面。

当然,凭着脑子记忆也是可以的,哪个公司的,哪个项目,常用版本号, 但一般都是记不住的。

六.一 已经知道存在于本地仓库的

如果知道一个 jar包在本地仓库,即已经下载到本机了,那么可以进行搜索,通常页面进行添加。 如fastjson 包。

选中项目中的 pom.xml 文件,选中第二个选项卡 Dependencies, 通过点击 add和 remove来进行添加和移除依赖。

添加依赖: 点击 add, 打开搜索的界面

有图片在这里插入图片描述

点击确定之后,就自动添加到依赖里面了。

 <dependencies>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>jsp-api</artifactId>
  		<version>2.0</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>servlet-api</artifactId>
  		<version>2.5</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>com.alibaba</groupId>
  		<artifactId>fastjson</artifactId>
  		<version>1.2.15</version>
  	</dependency>
  </dependencies>

六.二 不存在于本地仓库的

对于不存在本地仓库的jar包,该如何找到其对应的坐标呢? 总不能对每一个要引入的jar包,百度进行搜索吧。 你可以用 maven仓库的网址 进行搜索,https://mvnrepository.com/ 也可以在阿里巴巴的镜像上进行索引,阿里巴巴的网址是: https://maven.aliyun.com/mvn/search

阿里巴巴:直接进行搜索即可:

有图片

有图片

中央仓库: 也是直接搜索即可:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
谢谢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值