好文章 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” ,输入username:admin 和Password:admin123登录
第五步:登录成功
第六步:点击Views/Repositories 中Repositories
Nexus内置仓库说明:
(1)Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
从互联网中更新私服上索引
(2)Releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的正式发布版本构件,更加严格。
(3)Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的开发版本构件。
(4)3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从互联网中央仓库获得的第三方发布版本构件,比如oracle的一些jar包(例如classe12.jar),由于受到商业版权的限制,不允许在中央仓库出现,如果想让这些包在私服上进行管理,就需要第三方的仓库。
(5)Public 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>
其中:
(1)mirror配置:表示私服仓库组的路径
(2)为什么配置一个假的中央仓库地址,重写中央仓库的路径地址
保证不能从中央仓库地址,只能从私服的地址下载。
第十一步:Nexus的访问权限控制,在~/m2/setting.xml中配置如下:
<!-- 设置发布时的用户名 -->
<servers>
<!-- releases和snapshots表示是上传到正式仓库还是开发仓库 -->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
第十二步:部署构建到Nexus,包含Release和Snapshot, 在父项目(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 Artifact(s)
第四步:查看上传的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,包含Release和Snapshot, 在父项目(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>
第八步:将自己开发的项目Hello,HelloFriend,MakeFriend,Parent,Web发布到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的例子:
- <mirrors>
- <mirror>
- <id>mirrorId</id>
- <mirrorOf>repositoryId</mirrorOf>
- <name>定义一个容易看懂的名称 </name>
- <url>http://my.repository.com/repo/path</url>
- </mirror>
- </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,就表示只为仓库组中的第三方仓库做镜像,也就是说,本地开发需要的构件都只能从仓库组中的第三方库下载,将不能从仓库组中的其他库下载构件了。