仓库
区分 坐标和依赖与仓库
构件的逻辑表示方式:坐标和依赖
构件的物理表示方式:文件(Maven通过仓库来统一管理文件)
Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库
2.仓库的布局
groupId/artifactId/version/artifactId-version.packaging
3.仓库的分类
本地仓库
默认本场仓库目录 :用户名/.m2/repository
自定义本地仓库目录地址,编辑文件~/.m2/settings.xml
<settings> <localRepository>D:\java\respository</localRepository> </settings>
将本地项目的构件装到Maven仓库中
mvn clean install
该命令将项目的构件输出文件安装到本地仓库中
远程仓库
安装好 Maven后,本地仓库目录是不存在的,当输入第一条Maven命令后,Maven才会创建本地仓库,根据配置和需要,从远程仓库下载构件至本地仓库
中央仓库
Maven必须知道至少一个可用的远程仓库
中央仓库是一个默认的远程仓库,Maven安装文件自带了中央仓库的位置
%M2_HOME%/lib/maven-model-builder-3.0.5.jar中
org\apache\maven\model\pom-4.0.0.xml
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
包含这段配置的文件是所有Maven项目都会继承的超级POM
私服
一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用
优点:节省自己的外网带宽、加速Maven构建、部署第三方构件、提高稳定性,增强控制、降低中央仓库的负荷
4.远程仓库的配置
配置JBoss Maven仓库,在POM中配置
<project> <repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/</url> <releases> <enabled>true</enabled> </releases> </repository> <snapshots> <enabled>false</enabled> <updatePolicy>daily</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </snapshots> <layout>default</layout> </repositories> </project>
如上配置:Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件
default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局(不明白)
updatePolicy:daily(默认),never,always,interval:X(每隔X分钟检查一次更新)
checksumPolicy:warn(默认),fail,ignore
远程仓库的认证
配置仓库信息可以直接配置在POM文件中,认证信息必须配置在settings.xml中(POM往往被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机)
demo,编辑settings.xml
<settings> <servers> <server> <id>my-proj</id> <username>admin</username> <password>password</password> </server> </servers> </settings>
部署至远程仓库
Maven对项目进行编译、测试、打包外,还能将项目生成的构建部署到仓库中
编辑项目的pom.xml文件
<project> <distributionManagement> <repository> <id>proj-releases</id> <name>Proj Release Repopsitory</name> <url>http://192.168.1.100/content/repositories/proj-releases/</url> </repository> <snapshotRepository> <id>proj-snapshots</id> <name>Proj Snapshot Repopsitory</name> <url>http://192.168.1.100/content/repositories/proj-snapshots/</url> </snapshotRepository> </distributionManagement> </project>
需要认证时,需配置认证信息
配置正确后,运行命令
mvn clean deploy
5.快照版本
为什么区分发布版和快照版?例小张开发模块A的2.1版本,小季开发模块B,B依赖于A,小张需要将最新的构建输出,交给小季,供其开发和集成高度,工作如何进行?
Maven的快照版本机制:
小张将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布过程中,Maven会自动为构件打上时间戳。如2.1-20130309.233559-12表示2013年03月09日23点35分59秒的第12次快照;小季配置对于模块A的2.1-SNAPSHOT的最新构件,当发现有更新时便进行下载。默认情况下,Maven每天检查一次更新(由仓库配置的upldatePolicy控制),用户也可以使用命令行-U参数强制让Maven检查更新,如
mvn clean install -U
当项目需要发布时,将快照版本更改为发布版本。例如将2.1-SNAPSHOT更改为2.1,表示该版本已经稳定且对应了唯一的构件;2.1-SNAPSHOT往往对应了大量的带有不同时间戳的构件,这也决定了其不稳定性
快照版本只应该在组织内部的项目或模块间依赖使用(组织对于这些快照版本的依赖具有完全的理解及控制权)
项目不应该依赖于任何组织外部的快照版本依赖(快照版本的不稳定性,造成潜在危险)
6.从仓库解析依赖的机制
仓库元数据groupId/artifactId/versionmaven-metadata.xml
RELEASE:最新发布版本
LATEST:最新版本(包含快照)
依赖声明中使用LATEST和RELEASE是不推荐的做法(因为Maven随时都可能解析到不同的构件)
7.镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像
如:http://maven.net.cn/content/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务
编辑settings.xml
<settings> <mirrors> <mirror> <id>maven.net.cn</id> <name>one of the central mirrors in China</name> <url>http://maven.net.cn/content/groups/public</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>
<mirrorOf>值为central表示该配置为中央仓库的镜像
注:http://maven.net.cn/content/groups/public/这个镜像现在好像不能用了
如镜像需要认证,也可以基于该id配置仓库认证
镜像的一个常见应用:结合私服
如:
<settings> <mirrors> <mirror> <id>internal-repository</id> <name>Internal Repository Manager</name> <url>http://192.168.1.100/maven2/</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings>
<mirrorOf>值为星号,表示该配置是所有Maven仓库的镜像,任何远程仓库的请求都会被转至http://192.168.1.100/maven2/。
如果该镜像仓库需要认证,则配置一个id为internal-repository的<server>即可
更高级的镜像配置:
<mirrorOf>*</mirrorOf> 匹配所有远程仓库 <mirrorOf>external:*</mirrorOf> 匹配所有远程仓库,使用localhost、file://协议的除外,即匹配所有不在本机上的远程仓库 <mirrorOf>repo1,repo2</mirrorOf> 匹配仓库repo1和repo2 <mirrorOf>*,!repo1</mirrorOf> 匹配所有远程仓库,repo1除外
注意:由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库出问题时,Maven仍将无法访问被被镜像仓库,因而将无法下载构件
8.仓库的搜索服务
Sonatype Nexus http://repository.sonatype.org/
Jarvana http://www.jarvana.com/jarvana/
MVNbrowser http://mvnbrowser.com/
MVNrepository http://mvnrepository.com/
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@author Free Coding http://ln-ydc.iteye.com/