maven笔记2--仓库

简介:

得益于Maven坐标机制,任何Maven项目使用任何构件的方式都相同,因此,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就叫仓库

Maven仓库

仓库分本地仓库和远程仓库,当maven根据坐标寻找构件时,会首先查看本地仓库,如果本地仓库没有,就会去远程仓库查找,找到后下载到本地仓库使用

1.本地仓库

编辑~/.m2/settings.xml配置文件,来修改本地仓库的路径
<settings>
          <localRepository>D:\java\...</localRepository>
</settings>

2.中央仓库

Maven默认配置远程仓库地址,下面的pom文件是所有文件都会继承的超级pom。


3.私服


私服是一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。

  • 节省自己的外网带宽
  • 加速Maven构建                构建时只需访问局域网
  • 部署第三方构件                对于无法从外部远程仓库获得的构件,如,ojdbc.jar。可以自己下载后发布到私服,供内部使用
  • 提高稳定性,增强控制     私服(Nexus)提供了 权限管理,release,snapshot区分等
  • 降低中央库的负荷

4.远程仓库的配置

大多情况下,默认的中央仓库无法满足项目的需求,需要的构件可能存在另一个远程仓库,如JBoss Maven仓库。我们可以在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>
				<!-- maven从远程仓库检查更新的频率,daily,never,always,interval:X每隔X分钟 -->
				<updatePolicy>daily</updatePolicy>
				<checksumPolicy>ignore</checksumPolicy>
			</snapshots>
			<layout>default</layout>
		</repository>
	</repositories>
checksumPolicy:配置Maven检查检验和文件的策略,当构件被部署到maven仓库时,会同时部署对应的校验和文件。在下载构件时,maven会验证校验和文件,如果校验和验证失败,当checksumPolicy为warn时,maven会在构建时输出警告信息,fail,让构建失败,ignore,忽略校验和的错误。

5.远程仓库的认证

认证信息必须配置在settings.xml文件中

   <servers>  
      <server>  
      <id>nexus-releases</id>  
      <username>admin</username>  
      <password>*******</password>  
    </server>  
    <server>  
      <id>nexus-snapshots</id>  
      <username>admin</username>  
      <password>*******</password>  
    </server>  
  </servers>
注意:id必须和项目repository中依赖配置的仓库id一致

从远程仓库下载构件配置

<settings>  
.....
<profiles>  
   <profile>  
      <id>nexus</id>  
      <repositories>  
        <repository>  
          <id>nexus-releases</id>  
          <url>http://nexus-releases</url>  
          <releases><enabled>true</enabled></releases>  
          <snapshots><enabled>true</enabled></snapshots>  
        </repository>  
        <repository>  
          <id>nexus-snapshots</id>  
          <url>http://nexus-snapshots</url>  
          <releases><enabled>true</enabled></releases>  
          <snapshots><enabled>true</enabled></snapshots>  
        </repository>  
      </repositories> 
</profile>
</profiles>
.....
<settings>
本地构件jar包部署到私服配置

	<distributionManagement>
		<!-- 两个ID必须与 setting.xml中的<server><id>nexus-releases</id><server>保持一致 -->
		<!-- 版本jar包发布到中央仓库 -->
		<repository>
			<id>nexus-releases</id>
			<name>Nexus Release Repository</name>
			<url>http://***.***.***.***:8081/nexus/content/groups/public</url>
		</repository>
		<snapshotRepository>
			<id>nexus-snapshots</id>
			<name>Nexus Snapshot Repository</name>
			<url>http://***.***.***.***:8081/nexus/content/repositories/snapshots</url>
		</snapshotRepository>
	</distributionManagement>
执行  mvn clean deploy    将项目构件部署到对应的远程仓库

6.从仓库解析依赖的机制

镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取

  <mirrors>   
    <mirror>   
      <id>nexus-releases</id>   
      <mirrorOf>*</mirrorOf>   
      <url>http://***.***.***.***:8081/nexus/content/groups/public</url>   
    </mirror>  
    <mirror>   
      <id>nexus-snapshots</id>   
      <mirrorOf>*</mirrorOf>   
      <url>http://***.***.***.***:8081/nexus/content/repositories/snapshots</url>   
    </mirror>   
  </mirrors>   
由于私服可以代理任何外部的公共仓库,因此,对于公司内部maven用户来说,使用一个私服就等于使用了所有需要的外部仓库,这样我们就可以将配置集中到私服,从而简化Maven本身的配置

<mirrorOf>*</mirrorOf>  代表匹配所有远程仓库

注意:镜像仓库会完全屏蔽被镜像仓库,镜像仓库不稳定或停止服务时,Maven将无法访问被镜像仓库,因此无法下载构件。

7.仓库搜索服务

使用maven日常开发时,常见的问题就是如何寻找需要的依赖。

  • Sonatype Nexus:Nexus时当前最流行的Maven仓库管理软件,支持关键字搜索,类名搜索,坐标搜索,校验和搜索等功能。

地址:https://repository.sonatype.org/

  • MVNrepository:界面友好,个人用的最多

地址:http://mvnrepository.com/

使用Nexus创建私服

私服可以降低中央仓库负荷,节省外网带宽,加速maven构建,自己部署构件等。
Bundle包含Jetty容器,可以直接使用
war包需要在web容器中跑

Bundle方式安装Nexus


  • nexus-x.x.x.x/:该目录包含了Nexus运行所需要的文件,启动脚本,依赖jar包等
  • sonatype-work:包含nexus生成的配置文件,日志文件,仓库文件等
第一个目录是运行必须的。第二个目录不是必须的,nexus会在运行时动态创建该目录。当需要备份时,直接默认备份sonatype-work/目录就行

  • install-nexus.bat:将nexus安装成windows服务
  • uninstall-nexus.bat:卸载服务
  • start-nexus.bat:启动nexus windows服务

Linux启动Nexus服务:
  • ./nexus start:启动服务
  • ./nexus stop:停止服务
  • ./nexus status:查看后台nexus服务状态
  • ./nexus restart:重新启动后台的nexus服务
修改nexus默认8081端口:nexus-x.x.x.x/conf/nexus.properties       application-port属性

nexus内置仓库

4种仓库类型:
  • group 仓库组,为每个仓库声明maven配置比较麻烦,直接配置仓库组即可
  • hosted  宿主
  • proxy     代理
  • virtual    虚拟
每个仓库格式为maven2或maven1
policy属性:Release 表示该仓库为发布版本。Snapshot表示仓库为快照版本。

虚拟类型仓库的作用是动态地将仓库内容格式转换,及服务maven1格式的仓库。
  • Maven Central:代理maven中央仓库,只会下载和缓存中央仓库中的发布版本构件。
  • Release:宿主类型仓库,部署组织内部的发布版本构件
  • Snapshots:宿主类型仓库,部署组织内部的快照版本构件
  • 3rd party:宿主类型仓库,部署无法从公共库获得的第三方发布版本构件,如ojdbc.jar
  • Apache Snapshots:代理仓库,代理Apache Maven仓库的快照版本构件
  • Public  Repositories:仓库组,将所有策略为Release的仓库聚合并通过一致的地址提供服务

如上图:
Maven可以直接从宿主仓库下载构件,也可以从代理仓库下载构件,代理仓库会间接地从远程仓库下载并缓存构件;为了方便,Maven可以从仓库组下载构件,仓库组没有实际内容,它会转向其包含的宿主仓库或代理仓库获得实际的构件。

创建nexus宿主仓库


创建代理仓库



创建仓库组


仓库组所包含的仓库的顺序决定了仓库组遍历的顺序,所以将常用的仓库放在前面可以提高访问效率。

nexus的索引与构件搜索

nexus通过维护仓库的索引来提供搜索功能,在很大程度上方便maven用户定位构件坐标
设置maven central代理仓库下载远程索引。

  • GVA搜索    允许用户通过groupid,artifactid和version等信息来进行搜索
  • 类名搜索    搜索包含某个Java类的构件
  • 校验和搜索   允许用户直接使用构件的校验和 来搜索构件


除了下载使用远程仓库的索引,我们也能为宿主仓库和代理仓库建立索引。

对于宿主仓库来说,repair index会扫描仓库包含的所有构件并建立索引
对代理仓库来说,会扫描所有缓存的构件建立索引,如果远程仓库也有索引,则下载后合并索引。
对仓库组来说,会合并其包含的所有仓库的索引

配置maven 从nexus下载构件

通过maven提供的profile机制,可以在settings.xml中进行统一配置

使用activeProfile元素激活profile配置,当执行maven构建时,激活的profile会将仓库配置应用到项目中去
通过上面的配置,本机所有的maven项目都可以从nexus私服下载构件,但是maven除了从nexus下载构件之外,还会不时访问中央仓库central。这时就需要通过镜像配置来将所有的请求转到私服中。

部署构件至nexus

在项目pom.xml中配置


nexus对于匿名用户是只读的,为了能够部署构件,需要在settings.xml中配置认证信息


手动部署第三方构件至nexus

有些Java Jar文件,如Oracle的JDBC驱动,由于许可证的因素,无法公开放在公共仓库。这时就需要手动将这些jar包下载到本地,然后上传到私服中。


nexus访问控制模型

Nexus是基于权限(privilege)来做访问控制的,服务器的每一个资源都有相应的权限来控制,因此用户执行特定的操作时就必须拥有必要的权限。管理员必须以角色(Role)的方式将权限赋予Nexus用户。如:要访问Nexus界面,就必须拥有Status-(Read)这个权限,而nexus默认的角色UI:Basics  UI  Privelege就包含了这个权限,再将这个绝俗分配给某个用户,这个用户就能访问Nexus界面了。

Nexus预定义了三个用户:

  • admin:该用户拥有对Nexus服务的完全控制
  • deployment:能够访问nexus,浏览仓库内容,搜索,并且上传部署构件,但无法对nexus进行任何配置,默认密码 :deployment123
  • anonymous:对应所有未登陆的匿名用户,可以浏览仓库并进行搜索
常用角色:
  • UI:Basic UI Privileges      包含了访问nexus界面必须的最基本的权限
  • UI:Repository  Browser    包含了浏览仓库页面所需的权限
  • UI:Search                         包含了访问快速搜索栏及搜索页面所需要的权限
  • Repo:All Repositories(Read)  给予用户读取所有仓库内容的权限,没有仓库的读权限,用户将无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件
  • Repo:All Repositories(Full Control)   给予用户完全控制所有仓库内容的权限,用户不仅可以浏览,下载构件,还可以部署构件及删除仓库内容
Nexus包含了一个特殊的匿名角色(Nexus  Anonymous Role),默认配置下没有登录的用户都会拥有该匿名角色的权限,匿名用户可以访问基本的Nexus界面,浏览仓库内容及搜索构件

为项目分配独立的仓库

在组织内部,如果所有项目都部署快照及发布版本构件到同样的仓库,就会存在潜在的冲突及安全问题。为了不让项目之间的部署相互影响,为每个项目分配独立的仓库,并将仓库的部署,修改和删除权限赋予该项目的成员,其他用户只能读取,下载和搜索该仓库的内容。

有了仓库后,需要控制仓库的增,删,改,查权限,在Nexus中,这样的权限是基于Repository  Target建立的。Repository Target实际上是一系列正则表达式,在访问仓库某路径下内容时,nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。

.*表示匹配所有权限

任务调度


  • Download Indexes:为代理仓库下载远程索引
  • Empty  Trash:清空回收站,一些操作(如删除仓库文件)实际是将文件移到了回收站中
  • Evict  Unused  Proxied  Items  From  Repository  Caches:删除代理仓库中长期未被使用的构件缓存
  • Expire  Repository  Caches:Nexus为代理仓库维护了远程仓库的信息以避免不必要的网络开销,该任务就是清除这些缓存信息以强制Nexus去重新获取远程仓库的信息
  • Publish  Indexes:将仓库索引发布成可供m2eclipse和其他nexus使用的格式
  • Purge Nexus Timeline:删除nexus的时间线文件,该文件用于建立系统的RSS源
  • Rebuild Maven Metadata Files :重新创建仓库元数据文件maven-meta-data.xml,同时重新创建每个文件的校验和md5和sha1
  • Reindex  Repositories:为仓库生成索引
  • Remove  Snapshots  From  Repository:以可配置的方式删除仓库的快照构件
  • Synchronize Shadow  Repository:同步虚拟仓库的内容(服务于Maven1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值