任何一个构件都有唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这是Maven的仓库布局方式。
groupId/artifactId/version/artifactId-version(-classifier).packaging
对于Maven来说。仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,他首先会查看本地仓库,如果本地仓库存在此构件,则直接使用,如果本地仓库不存在此构件或需要查看是否有更新的构件版本,Maven会去远程仓库查找,发现需要的构件之后,下载到本地仓库使用。如果本地仓库和远程仓库都没有,Maven会报错。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,代理所有外部的远程仓库。
Maven的安装文件自带了中央仓库的配置。解压$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://repol.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
私服是一种特殊的远程仓库,它是架设在局域网内的仓库,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,他从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
私服的优点:
节省自己的外网带宽;加速Maven构件;部署第三方构件;提高稳定性,增强控制;降低中央仓库的负荷。
在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。任何一个仓库声明的id都是唯一的,若其他仓库声明也是用该id,就会覆盖该仓库的配置。Maven自带的中央仓库使用的id为central。
<project> <repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2/</url> <releases> <enabled>true</enabled> </releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout> </repository> </repositories> </project>
jar包版本的指定
<snapshots>/<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy> //用来配置Maven从远程仓库检查更新的频率。默认是daily,never,always(每次构建都检查更新),interval:x(每个x分钟检查一次)为可选参数
<checksumPolicy>ignore</checksumPolicy> //配置Maven检查检验和文件的策略
</snapshots>/</releases>
配置远程仓库的认证。settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致。
<settings> <servers> <server> <id>my-repo</id> <username>username</username> <password>password</password> </server> </servers> </settings>
如果仓库X可以提供仓库Y存储的所有内容,那么可以认为X是Y的一个镜像。即任何一个可以从仓库Y获得的构件,都能从它的镜像中获取。http://maven.net.cn/content/groups/publis/是中央仓库http://repol.maven.org/maven2/在中国的镜像,由于地理位置因素,该镜像往往能够提供比中央仓库更快的服务。因为可以配置Maven使用该镜像来替代中央仓库。mirrorOf的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像。
<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>
镜像更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库,对于组织内部的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化了Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像。
<settings> <mirrors> <mirror> <id>internal-repository</id> <name>Internal Repository</name> <url>http://192.168.1.100/maven2/</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings>
<mirrorOf>*</mirrorOf>,匹配所有Maven仓库的镜像。
<mirrorOf>external:*</mirrorOf>,匹配所有不在本机上的远程仓库。即使用localhost和file://协议的除外
<mirrorOf>repo1,repo2</mirrorOf>,匹配仓库repo1和repo2,使用逗号分隔多个远程仓库
<mirrorOf>*,!repo1</mirrorOf>,匹配所有除repo1之外的所有远程仓库
Maven在解析插件仓库元数据的时候,会默认使用org.apahce.maven.plugins和org.codehaus.mojo两个groupId。
Maven通过配置settings.xml检查groupId上的插件仓库元数据
<settings> <pluginGroups> <pluginGroup>com.your.plugins</pluginGroup> </pluginGroups> </settings>
基于上述配置,Maven不仅仅会检查org/apache/maven/plugins/maven-metadata.xml和org/codehaus/mojo/maven-metadata.xml,还会检查com/your/plugins/maven-metadata.xml
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步