Maven - 仓库
* Maven仓库?
在项目开发中, 项目目录下往往会有一个lib目录,用来存放第三方依赖jar文件, 如spring log4j jar等文件,
Maven仓库就是放置JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,节省了磁盘资源,
也节省了时间 不用拷来拷去的。
此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。
你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。
* 仓库分类
在运行Maven的时,Maven所需要的依赖构件都是直接从本地仓库获取的,如果本地仓库有依赖构建,直接使用;
如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
* 本地仓库缺省地址在${user.home}/.m2/repository目录下,(例如:C:\Documents and Settings\Administrator\.m2\repository)
自定义本地仓库位置:
配置进入maven/conf目录 编辑settings.xml文件 修改localRepository节点
<localRepository>D:\java\apache-maven-3.0.4\repository\</localRepository>
*中央仓库 是一个默认的远程仓库, 安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvn clean install,项目就构建好了。我们没有
手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven
安装就自带了一个远程仓库——Maven中央仓库。 这个Maven中央仓库是在apache-maven3\lib\maven-model-builder-3.0.4.jar中定义,
超级POM: \org\apache\maven\project\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用户使用,
当Maven需要下载构建的时候,先给私服仓库发出请求, 如果私服上不存在构建,则从外部的远程仓库下载,缓存到私服仓库中,再为maven的下载请求提供
服务。
* 远程仓库配置
1.编辑项目pom文件
<repositories> <repository> <id>maven-net-cn</id> <name>Maven China Mirror</name> <url>http://maven.net.cn/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>maven-net-cn</id> <name>Maven China Mirror</name> <url>http://maven.net.cn/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories>
repositories节点下,可以有多个repository,每个repository都有一个唯一的ID,一个name,以及最重要的,远程仓库的url。
此外<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,
而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。
2.在settings.xml中配置全局的远程仓库
在每个项目的pom中配置远程仓库 只是针对当前项目, 如果有10个项目 那就要配置10次 重复配置
可以做到只配置一次,就是在settings.xml中做全局配置
<settings> ... <profiles> <profile> <id>dev</id> <!-- repositories and pluginRepositories here--> </profile> </profiles> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> ... </settings>
* 远程仓库认证
编辑conf/settings.xml文件
<servers> <server> <id>和pom文件中repository->id元素相同</id> <privateKey>/path/to/private/key</privateKey> <passphrase>optional; leave empty if not used.</passphrase> </server> </servers>
server元素的id必须和pom中需要认证的repository元素完全一直。
*构建部署至远程仓库
mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库。
本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。
配置POM的distributionManagement来指定Maven的部署位置
<project> ... <distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Release Repository</name> <url>http://127.0.0.1:8088/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshot Repository</name> <url>http://127.0.0.1:8088/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> ... </project>
Maven区别对待release版本的构件和snapshot版本的构件,snapshot为开发过程中的版本,实时,但不稳定,release版本则比较稳定。
Maven会根据你项目的版本来判断将构件分发到哪个仓库。
一般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。这个时候,如下在settings.xml中配置认证信息:
<settings> ... <servers> <server> <id>nexus-releases</id> <username>username</username> <password>password</password> </server> <server> <id>nexus-snapshots</id> <username>username</username> <password>password</password> </server> </servers> ... </settings>
* 镜像
<settings> ... <mirrors> <mirror> <id>maven-net-cn</id> <name>Maven China Mirror</name> <url>http://maven.net.cn/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> ... </settings>