首页 > 代码库 > Maven实战读书笔记(6)
Maven实战读书笔记(6)
Maven的坐标和依赖是?构件的逻辑表示方式和物理表示方式是?
1、坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式
2、文件是Maven构件的物理表示方式
3、Maven通过仓库来统一管理这些文件
那么,构件是什么东东?
1、任何一个依赖、插件或者项目构建的输出,都可以称为构件
2、依赖log4j-1.2.15.jar是一个构件
3、插件maven-compiler-plugin-2.0.2.jar是一个构件
4、account-email项目构建完成后输出account-email-1.0.0-SNAPSHOT.jar也是一个构件
5、任何一个构件都有一组坐标唯一标识
传统的项目关于jar包的问题?
1、一个工作站上,可能有十几个项目
2、大部分项目可能都用到log4j,小部分用到Spring Framework,还有另外一小部分用到Struts2
3、很多项目都在重复复制jar,造成了磁盘空间的浪费,难于管理,文件复制等操作也会降低构建速度
4、传统项目往往有一个lib/的目录,各个项目lib/目录下的内容存在大量重复
如何解决上面的问题?什么是Maven的仓库?
1、得益于坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的
2、在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库
3、实际的项目将不再各自存储其依赖文件,它们只需要声明这些依赖的坐标
什么是仓库的布局?
1、任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式
2、例如log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar
3、其格式就是groupId/artifactId/version/artifactId-version.packaging
Maven仓库的分类?
Maven仓库只分为两类:本地仓库和远程仓库
Maven寻找构件的机制是?
当Maven根据坐标寻找构件的时候,它首先查看本地仓库,如果本地仓库存在此构建,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构建版本,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用,如果本地仓库和远程仓库都没有需要的构建,Maven就会报错
远程仓库的分类?
1、中央仓库是Maven核心自带的远程仓库,它包含了绝大部分开源的构件,在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载
2、私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内假设一个私有的仓库服务器,用其代理所有外部的远程仓库,内部的项目还能部署到私服上供其他项目使用
3、除了中央仓库和私服,还有很多其他公开的远程仓库常见的有Java.net Maven库
(http://download.java.net/maven/2/)和JBoss Maven库(http://repository.jboss.com/maven2)等
本地仓库介绍
1、Maven项目目录没有诸如lib/这样用来存放依赖文件的目录,当执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件
2、默认情况下,不管是windows还是Linux,每个用户在自己的用户目录下都有一个路径名为,m2/repository/的仓库目录
3、有些时候想修改仓库目录,可以编辑~/.m2/settings.xml,设置localRepository元素的值,例如:
<settings>
<localRepository>D:\maven\repository</localRepository>
</settins>
远程仓库介绍
1、远程仓库可有多个,本地仓库只能有一个
2、当Maven无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库
中央仓库介绍
1、最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件
2、中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置
3、使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar (在Maven 2 中,jar文件路径类似于M2_HOME/lib/maven-2.2.1-uber.jar),然后访问路径,org/apache/maven/model/pom-4.0.0.xml,可以看到如下配置:
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
对上面配置进行说明:
1、包含这段配置的文件是所有Maven项目都会继承的超级POM
2、这段配置使用id central对中央仓库进行唯一标识,名称为Maven Repository Switchboard,使用default仓库布局,snapshots元素,其子元素enabled的值为false,表示不从该中央仓库下载快照版本的构件
中央仓库的牛X之处
1、中央仓库包涵了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等,每个月这里都会接受全世界Java程序员大概1亿次的访问
2、中央仓库包涵了超过2000个开源项目的构件,一般来说,一个简单的Maven项目所需要的依赖构件都能从中央仓库下载到
私服是什么?
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用
使用私服的流程是?
当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务
此外,一些无法从外部仓库下载到的构建也能从本地仓库上传到私服上供大家使用
搭建私服的优势?
1、节省自己的外网带宽
2、加速Maven构建
3、部署第三方构件
4、提高稳定性,增强控制
5、降低中央仓库的负荷
配置POM使用JBOSS Maven仓库
在很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要的构件存在于另外一个远程仓库中,如JBoss Maven仓库
<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enable>true</enable>
</releases>
<snapshots>
<enabled>false</enable>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
...
</project>
对上面的配置说明:
1、在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。该例中声明了一个id为jboss,名称为JBoss Repository的仓库
2、任何一个仓库声明的id必须是唯一的,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置
3、该配置中的url指向了仓库的地址,一般来说该地址是基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件
4、重要的releases和snapshots元素的配置,该配置中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持,因此,在该配置中Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件
releases和snapshots下的另外两个子元素updatePolicy和checksumPolicy
你可能会遇到下面这样的配置:
<snapshots>
<enable>true</enable>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
关于updatePolicy的配置
元素updatePolicy用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次
其他可用的值包括:never——从不检查更新;always——每次构件都检查更新;interval:X——每隔X分组检查一次更新 (X为任意整数)
关于checksumPolicy的配置
元素checksumPolicy用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件,在下载构件的时候,Maven会验证校验和文件
那么,如果校验失败怎么办?
当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore——使Maven完全忽略校验和错误
Maven实战读书笔记(6)