为什么要使用maven
不使用maven的时候每个模块都需要导入插件,
在同一个项目中不同模块会导入重复的插件,造成资源浪费
使用maven后
,maven使用的是坐标机制,
所有的依赖都会从本地仓库中通过pom文件中定义的坐标获取,
另外,发布项目的时候,通过远程仓库,
可以实现只传递核心代码,而不用传递依赖
maven仓库
maven仓库可以分成本地仓库和远程仓库
本地仓库
通过settings.xml中的localRepository标签指定本地标签的位置
当用户输入第一个命令后骂着呢才会创建本地仓库然后个根据配置和需要,从远程仓库下载侯建到本地仓库
中央仓库
lib/maven-model-builder-3.5.2.jar/../pom-4.0.0.xml
这个pom文件是所有maven项目都会继承的超级pom
<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>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
该文件使用id central对中央仓库进行唯一标识,所有之后mirrorOf配置中央仓库需要些central
layout表示采用"."->"/"获取路径的方式获取依赖位置
私服
为了减少带宽,部署第三方构件等
声明远程仓库
模块的pom文件中,可以配置该模块需要访问的远程仓库
当该模块install后,pom文件也会被放在maven仓库中
使用该构件时,该构建所依赖的插件会通过pom文件中的配置去找
<repositories>
<repository>
<id>dependencies_Repositories</id>
<url>http://192.168.33.240:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>plugins_Repositories</id>
<url>http://192.168.33.240:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
updatePolicy配置Maven从远程仓库检查更新的频率默认为daily
checksumPolicy检查校验和文件的策略,当构件被部署到Maven仓库时,
同时会部署对应的校验和文件;
如果校验和验证失败,默认值为warn时,就会输出警告信息
fail,让构建失败;ignore,忽略校验和错误
快照
为什么要使用快照
对于Maven来说,相同的坐标对应一个构件
所以如果你对一个构件进行了更改,但是使用的还是原来的版本号,发布到私服上,别人已经缓存了你原来的构件,是不会重新下载你新发布的构建的
所以,你需要改动版本号
但是如果你频繁的更改版本号,只包含微小的差异,不提倡版本号的滥用
引入快照
发布到私服的过程中,maven会自动为构件打上时间戳,
maven-metadata-local.xml
从仓库中解析依赖的机制
当本地仓库没有依赖构件的时候,maven会自动从远程仓库下载;
当依赖版本为快照时,maven会自动找到最新的快照
1.当依赖范围是system时,Maven直接从本地文件系统解析构件
2.根据依赖坐标计算仓库路径,直接从本地仓库寻找构件,发现构件,则解析成功
3.本地仓库不存在构件,依赖版本是显示的发布版本构件,遍历所有的远程仓库
4.依赖版本是RELEASE或者LASTEST,基于更新策略读取所有远程仓库的元数据maven-metadata.xml,
将其和本地仓库对应的元数据合并,计算RELEASE或者LASTEST的真实值,然后基于这个真实的值检查本地和远程仓库,执行2,3
5.如果依赖是SNAPSHOT,基于更新策略读取所有远程仓库的元数据maven-metadata.xml.将其和本地仓库对应的元数据合并,得到最新的快照版本值,
基于这个值检查本地和远程仓库
镜像
匹配中央仓库
<mirrorOf>central</mirrorOf>
匹配所有的远程仓库
<mirrorOf>*</mirrorOf>
匹配除localhost外的所有远程仓库
<mirrorOf>exteral:*</mirrorOf>
匹配仓库repo1和repo2
<mirrorOf>repo1,repo2</mirrorOf>
匹配所有远程仓库,repo1除外
<mirrorOf>*,!repo1</mirrorOf>