Maven学习笔记之——仓库(上)
1、 何为maven仓库
Maven可以在某一指定位置统一存放所有maven项目共享的构件、此指定位置就是maven仓库。实际的项目将不再自己存放其所依赖的构件、他们只需要声明这些依赖的坐标、在需要的时候就会自动根据坐标找到仓库中的构件、并使用他们。
仓库的意义:减少磁盘占用空间、去除大量重复的构件、尤其是项目越来越多、越来越大的时候。更便于统一管理所有控件。
2、 仓库的布局
任何一个构件都有其唯一的坐标、根据这个坐标可以定义其在仓库中的唯一存储路径、这便是maven的仓库布局方式。
如org.andy.items:thikinjava:1.0是thikinjava-1.0.jar构件的坐标、则对应与存放在maven仓库中的目录就是:org/andy/items/thikinjava/1.0/thikinjava-1.0.jar。如果构件有classifier、就加上构件分隔符和classifier。假如上面例子的classifier是jdk1.6、则在仓库中的路径变为:org/andy/items/thikinjava/1.0/jdk1.6/thikinjava-1.0-jdk1.6.jar。
3、 仓库的分类
Maven中只有两类仓库:本地仓库和远程仓库。本地仓库就是搭建maven时指定或者默认的存放maven构件的文件夹(maven仓库使用的是简单的文件系统)。而远程仓库是存在与互联网上的外部仓库。
Maven项目中指定了构件的坐标之后、在使用时其会自动寻找、首先在本地仓库中查找、存在则使用、不存在则去指定或者默认的远程仓库(Maven的默认配置中指定的远程仓库是中央仓库)查找、存在、则下载到本地仓库再使用、不存在则报错。
私服是一种特殊的远程仓库、搭建在局域网内、用其代理所有外部的远程仓库、内部的项目还能部署到私服上供其他项目使用。
3.1 本地仓库
一般情况下、maven项目中没有lib这种用于存放依赖文件的目录、当maven在执行编译或者测试的时候、如果有需要使用的依赖文件、他自动的基于坐标使用本地仓库的依赖文件。
Maven中所有的设置都放在%M2_HOME/conf/settings.xml文件中。每个用户应该拥有自己的settings.xml文件、将%M2_HOME/conf/settings.xml复制到~/.m2/settings.xml下、然后修改自己的maven配置文件。好的习惯是好的开始、为自己、为团队减少不必要的麻烦。本地仓库如果不指定则默认放在${user.home}/.m2/repository。当然可以指定自己电脑上的任意位置、如D:\maven\repository\文件夹下、修改settings.xml文件。
<localRepository> D:\maven\repository </localRepository>
远程仓库中的构建要下载到本地仓库才能使用、本地自己使用的项目可以通过maven的命令安装到本地仓库中、maven常用的命令都是通过插件来执行的。常用命令——测试:test、编译:compile、清理:clean、安装:install、发布:deploy、打包:package等。
3.2 远程仓库
存在与互联网上用于提供构件。前面提到过、要使用某个构件时、就会先到本地仓库寻找、没有的话再从远程仓库寻找、找到就下载到本地仓库然后使用。本地仓库和远程仓库之间的关系就好比是自己的书房和网上书店的关系、自己想看的书先从书房找、没有的话从网上淘一本放到自己的书房看、自己的书房最需要一个就够了、而网上书店可以有很多、同样本地仓库只有一个、而远程仓库就可以有很多。我们可以在settings.xml中指定远程仓库。
3.3 中央仓库
Maven默认的远程仓库、供于我们没有手动设置的时候使用。这些我们从maven的settings.xml是看不到的。Maven有的POM具有继承性、所有的maven项目都会继承一个超级POM、这个超级POM在%M2_HOME/lib/maven-model-builder-3.2.3.jar(版本不同、后面的数据有可能不同)中、关于仓库Repository的一段配置:
<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>
中央仓库URL:http://search.maven.org/#browse ; id 中央仓库唯一标识。URL中央仓库访问地址。Layout:使用仓库默认布局(前面有提到).snapshots:不使用快照版本、也就是不稳定版本。
4、 私服
私服是一种特殊的远程仓库、是架设在局域网内的仓库服务、私服代理广域网上的远程仓库供maven用户使用、当maven需要下载构件时、它从私服请求、如果私服上没有则从远程仓库中下载、缓存到私服上之后、再为maven的下载请求提供服务。一些无法从远程仓库下载的构件、比如我们自己生成的构件也可以放在私服上供别人使用。
好处:
节省自己的宽带。
加速maven构建——不停的连接外部仓库很耗时、但是maven内部的机制要求maven在执行构建的时候不停地检测远程仓库数据。因此、当项目中配置了很多外部远程仓库的时候、构建速度大大降低、使用私服之后、当maven构建是只需要检测局域网内私服的数据的时候、构建速度能得到很大的提升。
部署第三方构件——主要是用于第三方构件不能从远程仓库中获取的时候、比如我们自己开发的模块供别人使用、Oracle的JDBC数据库连接驱动因为版权问题不能发布到公共仓库。建立私服之后、就可以把这些构建部署到私服中去、供内部的maven项目使用。
提高稳定性、增强控制——Maven构建高度依赖与远程仓库、当Internet不稳定的时候、Maven项目的构建也变了很不稳定甚至无法构建、使用私服有、私服中缓存了大量的构件供Maven构建的时候使用、此外有些私服提供了额外的服务供我们使用、如权限管理、RELEASE、SNAPSHOT分区等。
降低中央仓库的负荷——建立私服后、当需要新的构件的时候、私服只需要访问一次中央仓库、把构件缓存到私服上、这样使用这个私服的所有成员只需要从私服上下载构件到本地就可以使用、不再连接到中央仓库重复下载。