赞
踩
maven的仓库主要是用于存储及管理项目中所依赖的组件。可分为本地仓库
和远程仓库
,远程仓库有可以细分为中央仓库
、私有仓库
,中央仓库主要是由maven的开发团队负责开发管理的一些公共组件的公用的仓库;私有仓库主要是指个人通过一些第三方平台搭建的自己的专属仓库;私有仓库又可以根据配置的位置不同可分为全局profile仓库
、项目profile仓库
、项目仓库
、镜像仓库
。
<localRepository>D:\Work\Maven\repositoryNexus</localRepository>
<project> ... <profiles> <profile> <id>dev</id> <repositories> <repository> <id>nexus-repo</id> <name>nexus-repo</name> <url>http://127.0.0.1:8081/repository/maven-public/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <!--激活profile--> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> ... </project>
<project> ... <repositories> <repository> <id>snapshots</id> <name>snapshots-repo</name> <url>http://127.0.0.1:8081/repository/maven-snapshots/</url> <layout>default</layout> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> </repository> </repositories> ... </project>
<settings> ... <profiles> <profile> <id>dev</id> <repositories> <repository> <id>nexus-repo</id> <name>nexus-repo</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <!--激活profile--> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> ... </settings>
<settings>
...
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
lib
安装目录中有一个maven-model-builder-xxx.jar
,在这个jar包中有个org/apache/maven/model/pom-4.0.0.xml
文件,在这个pom文件中就配置了中央仓库,默认的中央仓库的id为central
。maven构建的时候,先从本地仓库去寻找组件,本地仓库找不到再去远程仓库中寻找,所以本地仓库的优先级要高于远程仓库。
要点:
(1)当配置多个repository时,无论是配置在settings.xml文件还是pom.xml文件中,依次从这些仓库中查找,如果第一个仓库能找到,就用第一个仓库,如果找不到,就依次往下找。
(2)当同时配置了多个repository和mirror时,如果当中某个repository的id与mirror的mirrorOf的内容相同时,则表示这个仓库被镜像了,将不在从该repository对应的url地址下载组件,而是直接从mirror中的url地址去下载组件。如果repository中的id都没有与mirror的mirrorOf的内容相同时,则依次从这些repository和mirror对应的url地址去查找,直到找到为止。
(3)当mirrorOf的内容为*
时,则表示该镜像可以是所有仓库的镜像,无论配置了多少个仓库,都不会从这些仓库对应的url地址去下载组件,只会从这个mirror中的url地址去下载组件。
配置远程仓库时需要清楚 settings.xml 一下配置节点的功能,清楚这些节点配置的 url 的优先级,是进行覆盖还是遍历,避免出现配置失效的情况,就算出现失效的情况也能找到失效的原因。
maven的settings.xml文件里面有proxy、server、repository、mirror的配置,在配置仓库地址的时候容易混淆
proxy 是服务器不能直接访问外网时需要设置的代理服务,不常用
server 是服务器要打包上传到私服时,设置私服的鉴权信息
repository 是服务器下载jar包的仓库地址
mirror 是用于替代仓库地址的镜像地址
可以理解为,mirrorof就是镜像规则。这个规则,将镜像mirror(settings.xml的设置)和远程仓库repository(pom.xml的repository设置)关联起来。哪个远程仓库被哪个镜像所替代。
mirrorOf 的值是 repository 的 id 或多个 id 的集合(多个以逗号隔开,还可以使用!)4
<mirrorOf>*<mirrorOf><!-- :匹配所有远程仓库。 -->
<mirrorOf>external:*<mirrorOf><!-- :匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。 -->
<mirrorOf>repo1,repo2<mirrorOf><!-- :匹配仓库repo1h和repo2,使用逗号分隔多个远程仓库。 -->
<mirrorOf>*,!repo1<mirrorOf><!-- :匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。 -->
注意:2
1、在mirrorOf 与 repository 的 Id 相同的时候优先是使用 mirror 的地址
2、mirrorOf 等于*的时候覆盖所有 repository 配置
3、存在多个 mirror 配置的时候 mirrorOf 等于 * 放到最后
mirror 优先级 高于 repository 配置。 特别是 mirror 配置了 mirrorOf等于 * , 那么 repository 配置就失效了。
maven获取真正起作用的repository集合流程:
首先会获取 repository 集合,然后在settings.xml里找mirrors元素, 如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository, 如果该repository找不到对应的mirror, 则使用其本身,依此可以得到最终起作用的repository集合, repositories中默认包含了中央仓库central,当然也可以重新它的url; 可以理解mirror是复写了对应id的repository
即 mirror 不是配置 mirrorOf等于 * , 那么最终的 获取远程 jar 就会 结合 mirror 与 repository 配置一起 获取都所有的远程maven 仓库。 然后 一个仓库一个仓库取找jar 。
profile 中环境配置,可以根据不同环境配置设置不同配置,然后根据 activeProfile 配置对应的 profile 的 id 进行激活对应的配置
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>本机mavne仓库地址</localRepository> <offline>false</offline> <pluginGroups> <pluginGroup>org.sonarsource.scanner.maven</pluginGroup> </pluginGroups> <proxies> </proxies> <servers> <!-- 用户验证,用于上传对应远程仓库 --> <server> <!-- 下方repository节点id --> <id>远程仓库2的id</id> <username>对应用户</username> <password>对应用户密码</password> </server> <server> <id>远程仓库3的id</id> <username>对应用户</username> <password>对应用户密码</password> </server> </servers> <mirrors> <!-- 远程仓库对应的镜像地址,优先从镜像地址获取资源。mirrorOf 包含的对应的远程仓库配置 id 都通过该镜像进行获取资源。mirrorOf 慎重配置 *,配置*则 repositories 失效 --> <mirror> <id>自定义镜像仓库id</id> <name>镜像仓库名称自定义</name> <mirrorOf>远程仓库集合或*</mirrorOf> <url>镜像地址</url> </mirror> </mirrors> <profiles> <profile> <id>dev</id> <repositories> <!-- 远程仓库地址,可以多个 --> <repository> <!-- (注意id不可与其他仓库id重复) --> <id>远程仓库1的id</id> <name>远程仓库名称自定义</name> <url>仓库地址</url> <releases> <enabled>true</enabled> </releases> <!-- 缺少这个会无法下载快照版本的jar --> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <!-- (注意id不可与其他仓库id重复) --> <id>远程仓库2的id</id> <name>远程仓库名称自定义</name> <url>仓库地址</url> </repository> <repository> <!-- (注意id不可与其他仓库id重复) --> <id>远程仓库3的id</id> <name>远程仓库名称自定义</name> <url>仓库地址</url> </repository> </repositories> </profile> </profiles> <!-- 激活对应的 profile 节点配置,可以激活多个 --> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> </settings>
部署构件至远程仓库
我们自己搭建远程仓库的目的就是为了可以方便部署我们自己项目的构件以及一些无法从外部仓库直接获取的构件。这样才能在开发时,供其他对团队成员使用。
Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构件部署到远程仓库中。首先,需要编辑项目的pom.xml文件。配置distributionManagement元素,代码如下:
注意:下方 id 要和 maven 的 setting.xml 文件中的 server 的id保持一致
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>稳定版仓库地址</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>快照文件仓库地址</url>
</snapshotRepository>
</distributionManagement>
setting.xml
<settings> ... <servers> <server> <id>releases</id> <username>用户</username> <password>密码</password> </server> <server> <id>snapshots</id> <username>用户</username> <password>密码</password> </server> </servers> ... </settings>
<!-- 配置远程仓库 --> <repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2/</url> <releases> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </releases> <snapshots> <enabled>false</enabled> <checksumPolicy>warn</checksumPolicy> </snapshots> <layout>default</layout> </repository> </repositories>
**repository:**在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
**id:**仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
**name:**仓库的名称,让我们直观方便的知道仓库是哪个,暂时没发现其他太大的含义。
**url:**指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。根据该配置,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
**layout:**元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
其他:对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。
1:元素updatePolicy用来配置Maven从远处仓库检查更新的频率,默认值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。
2:元素checksumPolicy用来配置Maven检查校验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。
setting.xml 和 pom.xml 的完整的节点说明可以参考 6
远程仓库配置主要4块,pom.xml中2种,settings.xml 中2种,其中 repository 配置是取pom.xml和settings.xml 的 repository 并集,在这些仓库中寻找资源,找到了就不继续查找其他仓库。
setting.xml 中的 mirror 的仓库地址通过 mirrorOf 配置被替代的 repository 的 id 集合,导致对应的 repository 配置的仓库地址失效,后面访问的都是是对应的 mirror 地址;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。