Maven的仓库(转载自Maven实战 作者许晓斌)

来源:互联网 发布:python之父谈go 编辑:程序博客网 时间:2024/05/15 04:07

1、Maven的仓库

Maven中任何一个依赖、插件或者项目构建的输出,都可以成为构件。任何一个构件都有一组坐标唯一标识。一个工作站上可能有几十个Maven项目,得益于坐标机制,任何Maven项目使用任何构件的方式都是完全相同的。再次基础上,Maven可以在某个位置存储所有Maven共享项目的构件,这个统一的位置就是仓库。在Maven项目中不再各自存储其依赖文件,只需要声明依赖的坐标,在需要的时候(编译项目的时候需要将依赖加入到classpath中),Maven会自动根据坐标找到仓库的构件并使用。

2、仓库的布局

任何一个构件都有其唯一的坐标,根据这个坐标定义其在仓库里的唯一存储路径。例如log4j:log4j:1.2.15这个依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar。坐标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。

3、仓库的分类

对于Maven来说仓库分为两类:本地仓库和远程仓库。中央仓库是Maven自带的远程仓库,它包含了大部分开源的构件。在默认情况下,本地仓库没有Maven需要的构件的时候,他就会尝试从中央仓库下载。

私服是另外一种特殊的仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有的外部的远程仓库,内部的项目还能部署到私服上供别的项目使用。

除了中央服务器和私服,还有其他许多公开的远程仓库,如java.net Maven库(http://download.java.net/maven/2/)和JBoss Maven库(http://repository.jboss.com/maven2/)等。

1、本地仓库

默认情况下Maven的本地仓库是在~/.m2/repository,如果因为C盘空间不够想要自定义了仓库的位置。可以编辑~/m2/settings.xml:

<settings>         <localRepository>...</localRepository></settings>
这样就可以更改本地仓库的地址。

一个构件只有在本地仓库中之后才可以被其他Maven项目使用。将项目安装到本地仓库中可以用指令:

mvn clean install
2、远程仓库

当Maven无法从本地仓库找到相应的构件时,就会从远程仓库下载构件到本地仓库。一个用户只有一个本地仓库,但是可以配置多个远程仓库。

3、中央仓库

最原始的本地仓库是空的,Maven的安装文件中自带了中央仓库的配置。在Maven的安装目录下的/lib/maven-model-builder-XX.jar的jar包中的pom-4.0.0.xml中有如下的配置:

<repositories>    <repository>      <id>central</id>      <name>Central Repository</name>      <url>https://repo.maven.apache.org/maven2</url>      <layout>default</layout>      <snapshots>        <enabled>false</enabled>      </snapshots>    </repository>  </repositories>
配置了默认的中央仓库,所有的Maven项目都会继承这个POM,所以都会有这个配置。

4、私服

私服是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网用户使用。当Maven需要下载构件的时候,他从私服请求,如果私服不存在当前构件,则从外部的远程仓库缓存到私服上之后再为Maven的下载请求提供服务,此外一些无法从外部仓库下载到的构件也可以手工上传到私服上供大家使用。

4、远程仓库的配置

很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要的构件存在于另外一个远程仓库,可以在POM进行配置:

<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></repository></repositories>
该配置中releases和snapshots使用来控制发布版本和快照版本的下载。这个配置表示允许下载发布版本,关闭JBoss仓库的快照版本的下载支持。根据该配置,Maven只会从JBoss仓库中下载发布版本的构件不会下载快照版本的构件。除了enabled之外还有updatePolicy和checksumPolicy:

<snapshots><enabled>false</enabled><checksumPolicy>ignore</checksumPolicy><updatePolicy>daily</updatePolicy></snapshots>
元素updatePolicy表示Maven从远程仓库的更新频率包括:daily、never、always、interval:x 每隔X分钟检查一次更新

checksumPolicy表示Maven检查检验和文件的策略。包括warn:构建时输出警告信息 fail:直接构建失败 ignore:忽略

1、远程仓库的认证

有些远程仓库基于安全的考虑需要提供认证信息才可以访问。配置认证信息需要在settings.xml文件中配置:

<server>    <id>deploymentRepo</id>    <username>repouser</username>    <password>repopwd</password></server>
2、部署到远程仓库

Maven除了对项目进行编译,测试和打包之外,还能将项目部署到仓库中,首先编辑POM文件添加distributionManagementy元素:

<distributionManagement><repository><id>proj-releases</id><name>Proj Releases Repository</name><url>http://192.168.1.100/content/repositories/proj-releases</url></repository><snapshotRepository><id>proj-snapshots</id><name>Proj Snapshots Repository</name><url>http://192.168.1.100/content/repositories/proj-snapshots</url></snapshotRepository>
然后如果需要认证需要根据上面的配置进行认证。

5、镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的镜像。配置如下:

  <mirrors>    <mirror>      <id>mirrorId</id>      <mirrorOf>repositoryId</mirrorOf>      <name>Human Readable Name for this Mirror.</name>      <url>http://my.repository.com/repo/path</url>    </mirror>  </mirrors>
其中mirrorOf对应被镜像的仓库ID。如果为* 表示该配置是所有Maven仓库的镜像。对于任何仓库的请求都会被转移到这个配置。

  • * :匹配所有的仓库
  • external:*:匹配所有的远程仓库,使用localhost的除外,使用file://的除外。
  • repo1,repo2:匹配仓库repo1和repo2,使用逗号分隔多个仓库。
  • *,!repo1 :匹配所有的远程仓库除了repo1。

需要注意的是由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务时,Maven将无法访问被镜像仓库。



0 0
原创粉丝点击