maven-nexus私服

好文章  http://my.oschina.net/guanzhenxing/blog/209578


Nexus私服 

第一步:下载nexus-webapp-1.9.2.4.war包,然后拷贝到tomcat下的webapps目录中,改名字为:nexus.war

第二步:启动tomcat

第三步:访问http://localhost:8088/nexus/显示如下:

 

 

第四步:点击右上角“log in输入usernameadmin Passwordadmin123登录

 

 

第五步:登录成功


 

第六步:点击Views/Repositories Repositories

 

 

Nexus内置仓库说明:

1Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。

从互联网中更新私服上索引

 

 

2Releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的正式发布版本构件,更加严格。

3Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的开发版本构件。

43rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从互联网中央仓库获得的第三方发布版本构件,比如oracle的一些jar包(例如classe12.jar),由于受到商业版权的限制,不允许在中央仓库出现,如果想让这些包在私服上进行管理,就需要第三方的仓库。

5Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。

第七步:创建宿主目录和代理仓库

Hosted本地仓库(当前服务器),通常我们会部署自己的构件到这一类型的仓库。 

包括3rd party仓库,Releases仓库,Snapshots仓库

Proxy代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。 

Group仓库组,用来合并多个hosted/proxy仓库,通常我们配置maven依赖仓库组。如果要将自己创建的仓库构建,通过私服也要查询出来,可以将自己创建的仓库构建部署到仓库组中。

Virtual:虚拟仓库,已经不用! 

 

注意:Hosted允许用户自己上传jar包,并可以下载使用

            Proxy不允许用户自己上传jar包,只能从中央仓库下载


中央仓库下的jar包都是从互联网下载的,有的在本地,有的仍在互联网仓库中。

如图:


带蓝色的jar表示已下载到私服的jar,不带蓝色的表示在互联网上的jar,还没有下载进私服中。


如果有现成的jar,可以直接替换私服的仓库,同时加上索引,如下:






第八步:创建仓库组

点击Public Repositories仓库,在Configurations栏中选取需要合并的仓库,点击箭头加到左边保存即可

 

 

第九步:下载Index索引并进行构建搜索(GAV搜索)

配置文件和顺序:MAVEN_HOME/conf/setting.xmlà~/.m2/setting.xmlàproject

第十步:配置所有构建均从私服下载,在~/.m2/setting.xml中配置如下:

<settings>

 <mirrors>

 <mirror>

 <!--此处配置所有的构均从私有仓库中下载 *代表所有,也可以写central -->

 <id>nexus</id>

 <!-- 拦截下来所有的仓库做镜像 -->

 <mirrorOf>*</mirrorOf>

 <url>http://192.168.3.100:8080/nexus/content/groups/public</url>

 </mirror>

 </mirrors>

 <profiles>

 <profile>

 <id>nexus</id>

 <!--所有请求均通过镜像,配置一个假的中央仓库地址,重写中央仓库的路径地址 -->

 <repositories>

 <repository>

 <id>central</id>

 <url>http://central</url>

 <releases><enabled>true</enabled></releases>

  <snapshots><enabled>true</enabled></snapshots>

 </repository>

 </repositories>

 <pluginRepositories>

 <pluginRepository>

 <id>central</id>

 <url>http://central</url>

 <releases><enabled>true</enabled></releases>

 <snapshots><enabled>true</enabled></snapshots>

 </pluginRepository>

 </pluginRepositories>

 </profile>

 </profiles>

<!-- 激活profiles -->

<activeProfiles>

 <!--make the profile active all the time -->

 <activeProfile>nexus</activeProfile>

 </activeProfiles>

 

其中:

1mirror置:表示私服仓库组的路径

 

2)为什么配置一个假的中央仓库地址,重写中央仓库的路径地址

保证不能从中央仓库地址,只能从私服的地址下载。

 

第十一步:Nexus的访问权限控制,在~/m2/setting.xml中配置如下:

<!-- 设置发布时的用户名 -->

 <servers>

<!-- releasessnapshots表示是上传到正式仓库还是开发仓库 -->

  <server>

 <id>releases</id>

<username>admin</username>

<password>admin123</password>

</server>

<server>

<id>snapshots</id>

<username>admin</username>

<password>admin123</password>

 </server>

 </servers>

 

第十二步:部署构建到Nexus,包含ReleaseSnapshot 在父项目(Parent)根目录中pom.xml中配置:

<!-- 依赖包发布到私服,将开发的包上传到宿主仓库-->

<distributionManagement> 

<!-- 上传到宿主仓库的releases -->

<repository> 

    <id>releases</id> 

    <name>Internal Releases</name> 

    <url>http://localhost:8080/nexus/content/repositories/releases/</url> 

</repository> 

<!-- 上传到宿主仓库的snapshots -->

<snapshotRepository> 

    <id>snapshots</id> 

    <name>Internal Snapshots</name> 

    <url>http://localhost:8080/nexus/content/repositories/snapshots/</url> 

</snapshotRepository> 

  </distributionManagement>

 

第十三步:将自己开发的仓库发布到私服上去,选择parent项目中的pom.xml。执行clean deploy。大家可以看到我们开发的项目已经上传到了私服上。

 

样例settings

样例pom



思考:将工程中所有的Snapshot改成Release,大家看看是什么效果?结果就是会在Releases的仓库中看到我们的项目包。

<groupId>zpeng..maven</groupId>

  <artifactId>parent</artifactId>

  <version>0.0.1-Release</version>

  <packaging>pom</packaging>



如何将classes12.jar上传到私服中的第三方仓库(之所以有些包只能上传到第三方仓库中,是因为这些涉及商业版权的问题,无法从互联网下载,所以如果想让这些包交给maven-nexus来管理,就必须将其上传至第三方仓库中)

第一步:选择3rd party,会看到下方的Artifact Upload

第二步:完成配置:

第三步:点击Add Artifact,最后点击upload Artifacts

第四步:查看上传的jar

第五步:查看上传的classes.jar包的坐标:


 




此时已经说明,私服上已经存在了6ck这个jar,如果我们本地开发人员使用的话,直接写上它的坐标即可。如下:


即会将私服的jar下载到本地仓库,如下:



完成classes.jar的包下载到本地仓库:

第一步:配置所有构建均从私服下载,在~/.m2/setting.xml中配置如下:

<settings>

 <mirrors>

 <mirror>

 <!--此处配置所有的构建均从私有仓库中下载 *代表所有,也可以写central -->

 <id>nexus</id>

 <!-- 拦截下来所有的仓库做镜像 -->

 <mirrorOf>*</mirrorOf>

  <!-- 仓库组地址 -->

<url>http://192.168.3.100:8080/nexus/content/groups/public</url>

 </mirror>

 </mirrors>

 <profiles>

 <profile>

 <id>nexus</id>

 <!--所有请求均通过镜像,配置一个假的中央仓库地址,重写中央仓库的路径地址,目的是:保证不使用从本地仓库,而是从私服上访问 -->

 <repositories>

 <repository>

 <id>central</id>

 <url>http://central</url>

 <releases><enabled>true</enabled></releases>

  <snapshots><enabled>true</enabled></snapshots>

 </repository>

 </repositories>

 <pluginRepositories>

 <pluginRepository>

 <id>central</id>

 <url>http://central</url>

 <releases><enabled>true</enabled></releases>

 <snapshots><enabled>true</enabled></snapshots>

 </pluginRepository>

 </pluginRepositories>

 </profile>

 </profiles>

<!-- 激活profiles -->

<activeProfiles>

 <!--make the profile active all the time -->

 <activeProfile>nexus</activeProfile>

 </activeProfiles>

第二步:将classes.jar包的坐标放置到项目Hello中的pom.xml

<dependencies>

    <dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

</dependency>

<dependency>

  <groupId>cn.itcast.oracle</groupId>

  <artifactId>jdbc</artifactId>

  <version>10.0</version>

</dependency>

</dependencies>

第三步:保存Hello项目中的pom.xml,可以在本地仓库中看到classes.jar包,这是从私服上下载到本地仓库的包。

同时发现Hello项目中已经存在jdbc-10.0.jar

 

在私服上创建自己的(宿主仓库,所以我们的包上传至宿主仓库,供我们部门的开发人员使用,其他的包还需要私服的代理仓库从互联网下载)仓库,并配置用户,角色,权限

应用场景


第一步:建立自己的仓库

创建一个本地的主机仓库,在配置中配置以下信息


 

第二步:配置权限


以上是添加“zhangpeng1”的权限。

 

第三步:添加角色


以上是添加“zpeng-admin”的角色


选择权限



第四步:添加用户



选择需要添加的角色


 

第六步:部署构建到Nexus,包含ReleaseSnapshot 在父项目(Parent)根目录中pom.xml中配置:

<distributionManagement> 

<repository> 
   <id>zhangpeng1</id> 
   <name>zhangpeng1</name> 
   <url>http://192.168.1.80:8088/nexus-2.1.2/content/repositories/zhangpeng1</url> 
</repository>

</distributionManagement>

<!-- 依赖包发布到私服,将开发的包上传到宿主仓库-->



第七步:Nexus的访问权限控制,在~/m2/setting.xml中配置如下:

<!-- 设置发布时的用户名 -->

 <servers>

<server>
<id>zhangpeng1</id>
<username>zp512</username>
<password>zhangpeng</password>
</server>

 </servers>

 

第八步:将自己开发的项目HelloHelloFriendMakeFriendParentWeb发布到department6的仓库中,使用命令clean deploy

 




注意:如果发现没有部署成功Web,应该去掉Web中的pom.xml中红色部分的配置:

<build>

    <finalName>web</finalName>

    <plugins>

          <plugin>

              <groupId>org.codehaus.cargo</groupId>

              <artifactId>cargo-maven2-plugin</artifactId>

    <version>1.2.3</version>

    <configuration>

        <container>

            <containerId>tomcat7x</containerId>

            <home>D:/apache-tomcat-7.0.27</home>

        </container>

        <configuration>

            <type>existing</type>

            <home>D:/apache-tomcat-7.0.27</home>

        </configuration>

    </configuration>

    <executions>  

                  <execution>  

                      <id>cargo-run</id>  

                      <phase>install</phase>  

                      <goals>  

                          <goal>run</goal>  

                      </goals>  

                  </execution>  

              </executions>

          </plugin>

      </plugins>

  </build>

 

 

 

 

 mirrors详解

 一、

mirrors:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一个repositoryId。

看以下是一个使用mirrors的例子:

Xml代码  
  1. <mirrors>  
  2.     <mirror>  
  3.       <id>mirrorId</id>  
  4.       <mirrorOf>repositoryId</mirrorOf>  
  5.       <name>定义一个容易看懂的名称 </name>  
  6.       <url>http://my.repository.com/repo/path</url>  
  7.     </mirror>  
  8. </mirrors>  

 

l  id:是用来区别mirror的,所有的mirror不能有相同的id

l  mirrorOf:用来表示该mirror是关联的哪一个仓库,其值为其关联仓库的id。当要同时关联多个仓库时,这多个仓库之间可以用逗号隔开;当要关联所有的仓库时,可以使用“*”表示;当要关联除某一个仓库以外的其他所有仓库时,可以表示为“*,!repositoryId”;当要关联不是localhost或用file请求的仓库时,可以表示为“external:*”。

l  url:表示该镜像的url。当Maven在建立系统的时候就会使用这个url来连接到我们的远程仓库。

 

 二、

先说mirrors中mirror的作用,mirrors允许配置多个镜像mirror,mirror的作用一般是为了使用一个更快速度的镜像,主要是访问速度的考虑,或者突破屏蔽使用可以访问的镜像。


在maven中不配置mirror时使用的maven的中央库。


在maven中配置一个mirror时,mirror通常会设置成*,还有可能是一个具体的值,还有可能是逗号隔开的几个值..

例如:

1.*

2.repo3

3.repo1,repo2,*,!repo3

4.external:*

在上面4个例子中,第一个例子中*的意思就是(根据mirrorOf和repository的id)匹配所有的库(repository),这样就是说如果你需要某个jar,他会从镜像地址去下载这个jar。不管你配置了多少个库,即使这些库的地址不一样,仍然会从镜像地址访问,这里就产生了问题。

问题:为什么我配置好了库(repository),但是下载不下来(或者下载地址不对)?

这个问题已经很明白了,就是镜像(mirror)的问题。

问题:如何解决上述问题呢?

这里请继续看第二个例子和第三个例子。


第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的库,该库会使用repo3的镜像访问。这里说重点了,即使存在一个*的,这里会先查找完全相同的存储库标识符匹配的镜像,如果找到了,就用匹配的,这里就是repo3,这点可以放心。如果找不到,那就去根据其他的mirrorOf查找去,查找到一个就使用。这里需要注意的是,如果存在多个重复的mirrorOf,只会用排名靠前的第一个(按照配置顺序来)。如果一个都没有,就会用maven中央库。


第三个例子是用逗号隔开的好几个,并且有一个特殊的!repo3,一般!的意思是非,这里的意思就是,就是排除repo3的情况。综合起来第三个的含义就是完全匹配repo1,repo2和其他全部库,排除repo3库。


到这里,第二个问题已经有了答案,给这个库配置单独的镜像,而且位置尽量在前面,id和mirrorOf一致。说到这两个一致,还得说两个不能一致的情况,就是mirror的mirrorOf不能和任何mirror的id一致,因为id在setting中唯一,mirrorOf要和库的id一致,所以势必不能和mirror的id一致,如果一致显然就起不到作用了(这里属于猜测,官方要求不能一致)。


第四个例子很特殊,含义就是匹配本地库之外的全部库。如果本地库存在,就用本地库的。

 三、

mirror则相当于一个代理,它会拦截去指定的远程repository下载构件的请求,然后从自己这里找出构件回送给客户端。配置mirror的目的一般是出于网速考虑。 

不过,很多internal repository搭建工具往往也提供mirror服务,比如Nexus就可以让同一个URL,既用作internal repository,又使它成为所有repository的mirror。

高级的镜像配置: 
1.<mirrorOf>*</mirrorOf> 
匹配所有远程仓库。 这样所有pom中定义的仓库都不生效
2.<mirrorOf>external:*</mirrorOf> 
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。 
3.<mirrorOf>repo1,repo2</mirrorOf> 
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。 
4.<mirrorOf>*,!repo1</miiroOf> 
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。 


mirrors可以配置多个mirror,每个mirror有id,name,url,mirrorOf属性,id是唯一标识一个mirror就不多说了,name貌似没多大用,相当于描述,url是官方的库地址,mirrorOf代表了一个镜像的替代位置,例如central就表示代替官方的中央库。


我本以为镜像库是一个分库的概念,就是说当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载。但事实却不是这样,当第一个mirror中不存在a.jar的时候,并不会去第二个mirror中查找,甚至于,maven根本不会去其他的mirror地址查询。


后来终于知道,maven的mirror是镜像,而不是“分库”,只有当前一个mirror无法连接的时候,才会去找后一个,类似于备份和容灾。

还有,mirror也不是按settings.xml中写的那样的顺序来查询的。

所谓的第一个并不一定是最上面的那个。


当有id为B,A,C的顺序的mirror在mirrors节点中,maven会根据字母排序来指定第一个,所以不管怎么排列,一定会找到A这个mirror来进行查找,当A无法连接,出现意外的情况下,才会去B查询。


 

 http://my.oschina.net/qjx1208/blog/201085

http://yingzhuo.iteye.com/blog/1009066

http://www.blogjava.net/zyl/archive/2006/12/29/90802.html

http://blog.csdn.net/jinshuaiwang/article/details/23686099

http://blog.csdn.net/isea533/article/details/21560089

 

 

表示为仓库组中的所有仓库做镜像,如果换成3rd party,就表示只为仓库组中的第三方仓库做镜像,也就是说,本地开发需要的构件都只能从仓库组中的第三方库下载,将不能从仓库组中的其他库下载构件了。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值