Nexus 私有仓库搭建与 Maven 集成
Maven 是日常开发过程中,都会接触到的项目管理工具。Maven 可以将开发人员从繁杂的文档管理、项目打包等工作中解放出来,把更多的精力放在业务开发上。Maven 带来的便利这里就不多说了,但是只是单单使用 Maven,有时候也会遇到依赖文件无法下载的情况,原因有很多,有可能是中央仓库的问题,也有可能是网络问题等等;与此同时,有一部分的第三方的类库是没有发布到 Maven 上的,因此并没有 Maven 相关的依赖信息,这就给我们使用 Maven 构建项目带来了一定的麻烦。例如以下的这个例子,就是经常会遇到的问题。
在最近的一个测试项目中,由于个人比较喜欢有条不紊,所以一直是使用 Maven 作为项目构建的工具,但是在构建 Hibernate 相关依赖的过程中,发现有一部分相关的 Jar 无法正常下载,中间也换过各种软件仓库,但是最后都是无法正常构建项目。
1 2 3 4 5 6 |
|
最后,实在没辙了,想起了要搭建一个私有仓库。本文主要介绍 Nexus 私有仓库的搭建过程,以及 Nexus 与 Maven 的整合。本文使用的 Nexus 版本为 Nexus Repository Manager OSS 2.14.5-02 ,之所以不使用最新的 Nexus Repository Manager OSS 3 是因为个人感觉版本3还没有版本2友好,特别是在图形管理界面的操作上。
首先需要到官网上下载 Nexus Repository Manager OSS 2.14.5-02 的安装包,下载地址为:https://www.sonatype.com/download-oss-sonatype,解压后的目录结构:
在命令行窗口,进入 \nexus-2.14.5-02-bundle\nexus-2.14.5-02\bin 目录,输入 nexus install 命令,安装 Nexus(需要等待一小段时间)。安装成功后,进入服务管理界面,找到一个名为 nexus 的服务,启动该服务,服务启动完成后,打开浏览器,输入 http://localhost:8081/nexus ,如果可以看到欢迎界面,说明 Nexus 安装成功了。
点击右上角的登录按钮,输入管理员账号和密码(默认账号:admin,密码:admin123)登录。
登录成功后,选择左边 Views/Repositories 菜单下的 Repositories,可以看到一些预设的仓库,我们会用到的一般只有 Public Repositories 和 3rd party , Public Repositories 为公共仓库,3rd party 为第三方仓库,可以上传第三方的 Jar (当然也可以是自己封装的 Jar)。
Nexus 安装成功后,接下来需要修改 Maven 的配置文件(settings.xml),整合 Nexus。
找到 <servers> 标签,添加 Nexus 默认认证信息:
1 2 3 4 5 6 7 8 9 10 |
|
找到 <mirrors> 标签,添加镜像:
1 2 3 4 5 6 |
|
找到 <profiles> 标签,添加仓库信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
激活仓库:
1 2 3 4 |
|
配置完成后保存,并重启 nexus 服务。
重启 nexus 服务 完成后,在命令行窗口进入一个使用 Maven 构建的项目,输入 mvn package clean 命令,清理完成后,登录 nexus 的 admin 账号可以看到 Public Repositories 下出现了一些 Jar 包。
此时刷新之前报错的项目,发现 Maven 依赖仍然有问题,无法正常下载 jboss 的一个 Jar 包。这个时候我们可以利用我们刚刚搭建的 Nexus 私有仓库,在网上自己下载缺失的 Jar 包,然后以第三方 Jar 的形式上传到私有仓库,依赖信息可以设置跟中央仓库一样。例如添加 jbosscache-core-3.2.1.GA.jar ,在外网上的依赖为:
1 2 3 4 5 |
|
选择 3rd party,把我们自己下载的 jbosscache-core-3.2.1.GA.jar 上传到 3rd party。在 Artifact Upload 选择卡页面,点击 Select Artifact(s) to Upload 按钮,选择需要上传的 Jar 包,选择完成后点击 Add Artifact 按钮。然后设置 Jar 的 Maven 依赖信息(后续引用 Jar 包需要用到),其中 Maven 依赖的相关信息可以设置成和中央仓库一致,如下图:
Jar 包上传成功后,切换到 Browse Index 选项卡页面,点击刷新按钮,可以看到我们刚刚上传的 Jar 包,选中 Jar 包我们可以在右边看到 Jar 包对应的 Maven 依赖信息,可以用于项目的构建。
进入本地仓库删除 \.m2\org\jboss\cache\jbosscache-core\3.2.1.GA 目录下的所有文件(重要,否则会构建失败),此时,再次回到刚刚构建失败的项目,刷新 Maven,可以看到项目已经可以正常构建了。
如果本地安装了 Maven,可以在 Maven 的安装目录找到一些常用的软件仓库,位置为:${MAVEN_HOME}\lib\maven-model-builder-3.3.3.jar 下 \org\apache\maven\model\pom-4.0.0.xml ,其中 ${MAVEN_HOME} 为 Maven 的安装目录,用编辑器打开 pom-4.0.0.xml 可以看到很多预设的软件仓库。
此处,也提供一些常用的软件仓库:
http://maven.aliyun.com/nexus/content/groups/public(阿里云,推荐)
这里,也提供一些 Maven 的参考资料:
http://www.codeweblog.com/category/maven-gradle/
|出处:http://www.cnblogs.com/rexfang/
nexus的作用
在maven中有一个很重要的概念:仓库。在开发时有本地仓库,然后有maven的中央仓库。但对于一个企业或部门而言,却没有一个属于自己的仓库,一个企业也有自己封装的jar包和插件,本地仓库仅限每个开发者使用,中央仓库包罗万象供全球使用,但是没有为为企业提供管理自己产品的地方。引入nexus,就是为了搭建企业级的私有仓库,管理企业级依赖。下图是maven中nexus的作用图示:
nexus除了上面的作用外,还有很多好处,如节省贷款,控制和审计、部署第三方控件等,为maven的管理提供了很大的便利。
为maven提供搭建企业级私服的工具还有一些,但是常用的是sonatype公司的nexus软件。其包含jetty容器,可以自发布,实现仓库和权限管理。
nexus搭建步骤
1. 下载nexus,地址:http://www.sonatype.org/nexus/go/
2. 将下载文件拷贝到一个指定的文件夹,如:D:\maven_home\co_repository,然后解压缩,得到文件夹结构:
说明:nexus-2.11.0-02包含nexus程序,sonatype-work是nexus仓库保存jar包的默认路径。
3.设置环境变量,添加nexus的工作路径,在系统变量path前添加这段话:D:\maven_home\co_repository\nexus-2.11.0-02\bin;(windows)
注意:nexus oos版本,推荐安装的操作系统时linux,如果是unix,nexus官方文档说是可以支持。但是我用hp-ux的操作系统时,却不支持。因为%NEXUS_HOME%/bin/jsw/目录下,并没有对应hp-ux的平台启动程序。官方的说法也是推荐安装在linux上,unix下的安装未经过深度测试。
linux下可以不修改环境变量,直接在%NEXUS_HOME%/bin/目录下,执行命令:./nexus start 或./nexus stop命令,即可启动或停止程序。
4. 进入cmd命令,输入命令:nexus,可以看到如下界面:
5.命令的意思很清楚。现在开始启动,首次启动前先要执行:nexus install,将nexus服务添加到本地服务中:
然后再执行:nexusstart
6.Nexus启动后,访问网址(这里安装在本地):http://localhost:8081:nexus。得到界面:
到此,nexus安装完成。
nexus配置
使用默认仓库配置
1.登陆。点击右上角的:Log In。输入用户名密码:admin/admin123(默认)。登陆后,点击右侧的菜单栏:views/repository->Repositories,得到界面:
关于上面这个界面,先做点笔记:
上图红框中有很多仓库(repository),仓库中对应保存来自不同地方的依赖和插件。这些仓库有很多类型(type),大概有四个类型:
1)proxy,来自开源网站的一些依赖,如apache、中央仓库(central)、codehaus;
2)virtual,主要用于maven1,很少用到;
3)hosted,顾名思义,这是针对我们开发者的,我们的可以上传自己的第三方包到3rd party,上传开发或发布的包到snapshots或releases;
4)group,可配置以上三种类型的repository到一个组,配置此组就可以有组中仓库的访问权限。
2. 让本地项目到nexus仓库下载jar依赖,配置项目中的pom.xml文件。比如我这里有一个maven项目maven_part4,配置pom.xml添加以下一段代码:
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
注意:配置中的ID,name无限制,可以自定义。但url标签需要指定仓库的访问url。
说明:group类型的Repository是可配置的,在红框三中配置。将右侧的选项,添加到左侧,保存。所添加的仓库,在此组中就可以被访问。
3.上面步骤中,为了将远程仓库路径指向nexus的仓库路径,修改的是maven项目的pom.xml。那么,如果我们在新增项目,还是需要修改每个项目的pom.xml。为排除上面的不便,我们可以修改本地maven的配置:${user_home}/.m2/settings.xml,新增下面两段话:
3.1)在<profiles>标签中增加一个profile配置,如下:
<profile>
<id>nexusProfile</id>
<repositories>
<repository>
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
<!-- open this,can download releases version dependency-->
<releases>
<enabled>true</enabled>
</releases>
<!-- open this,can download snapshot version dependency,default is false. -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repositories>
</profile>
3.2)在<activeProfiles>标签中,激活上面的profile配置,如下:
<activeProfiles>
<activeProfile>nexusProfile</activeProfile>
</activeProfiles>
这样,所有本地使用此maven的项目都会指向nexus仓库了。
(问题:
我配置完此项后,settings.xml并未生效。
后来是因为myeclipse中的配置未更新。Myeclipse中有两处settings.xml需要修改:一、maven路径下的setting.xml,本地所有maven都会采用此配置;二、用户路径下的settings.xml,路径${user_home}/.m2/settings.xml,修改过此配置文件,如果配置未生效,最好在myeclipse中找到此项,确认路径正确,并点击update settings,刷新配置。(就是因为这个原因,我修改过的settings迟迟不生效))
Maven继承理解:maven项目都有一个super POM,这是所有POM的父类,包含很多默认配置;然后是%M2_HOME%/conf/settings.xml,此配置的之也会融入POM,此配置针对maven程序;其次是${user_home}/.m2/settings.xml,此配置针对用户,其配置项会覆盖maven级的settings.xml,再融入POM;最后是项目的POM,针对项目的特殊性做配置。上面的四个文件共同对一个项目生效。
Profile配置理解:在一个maven项目中,可能在不同的情况下需要的运行环境有所不同。如,在开发时下我们用一套环境,在发布时我们用另一套环境;或者系统为了兼容多版本的jdk,需要做一些调整,也就需要对不同的jdk做不同的配置等。
一个profile配置,就是一个环境的特定设置,可以对同一个环境配置多个profile。
配置了profile不代表此配置就生效,profile生效有两种方式:一、用特定环境的信息触发此配置生效,用<activation>标签;二、profile可以不包含<activation> 标签,但是需要在<activeProfiles>标签中,引用profile的id,来定义指明你需要让哪些profile生效。
4.mirror的使用。
如果我们需要一个公司只管理一个自己的私有仓库,不能让开发者直接从中央仓库下载依赖,那我们需要为中央仓库设置一个镜像,将中央仓库的链接指向nexus的仓库链接。镜像配置在${user_home}/.m2/settings.xml中。在<mirrors>标签中增加如下配置:
<mirror>
<id>nexusMirror</id>
<mirrorOf>*</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
注意:这里的mirrorOf配置的是repository的ID,代表匹配ID的工厂都访问此镜像;若配置多个repositoryID,可用英文逗号分隔;若配置*号,代表maven用户中所有工厂都访问此镜像。
其次,mirror只是映射符合条件(mirrorOf指定)的仓库的URL,而与匹配仓库的其他参数无关,若要修改,需要在对应的仓库位置修改。
中央工厂配置在super POM中,工厂id为central,若只是想明确的设定某几个工厂的镜像,可以这样写,如:<mirrorOf>nexus,central</mirrorOf>
设置管理自己仓库组
5.在nexus中,有现成的Releases和Snapshots仓库。但是一个公司中,可能有几个不同的研发部门或不同的研发组,他们需要管理自己各自的开发和发布版本。Nexus为我们提供了创建自己的仓库和访问权限的功能。
首先,点击Add,选Hosted Repository项:
弹出仓库配置界面,填写对应值,如下:
如图上,填写仓库ID、名称、Provider。Repository Policy选择是开发还是发布仓库,但我们提交本地maven项目到nexus时,我们的项目的版本会自动识别放入对应的仓库中;四是设定上传依赖的仓库路径,可以默认自动生成。
一般创建两个仓库,一个用于发布,一个用于开发。如下:
然后需要为这两个新建仓库建一个组,将对应的仓库访问权限包含在其中。创建组方式类似:点击Add,选Repository Group。填写组仓库信息,配置组包含的仓库。如下:
现在一个属于某个部门的组就定义好了。在本地开发需要做的是,将settings.xml中的nexus仓库的访问地址改成我们的MyRepositoryGroupId的发布地址。
nexus部署配置
6.在nexus中,我们可以做的工作大致有两个:一个是获取依赖,而是上传打包项目。上面已经完成了获取依赖的配置,现在是nexus的部署管理。Nexus部署涉及到权限管理,我们每次往nexus中上传项目时,需要有对应的用户名和密码。此配置在如下位置:
对于权限管理需要配置三个地方,如上图红框所示:Privileges、Roles、Users。
6.1)首先配置privileges,将我们新建的仓库权限管理起来:
新增两个权限,一个是未开发版本库(snapshots),一个为发布版本库(releases)。如下图:
两个都新增后,如图:
6.2)创建可以访问club仓库的角色。点击Roles,进入添加角色:
点击ADD。(问题,第一次添加了privileges后,在Roles中添加权限,居然没有新增项,重启了nexus,新增数据才展示出来)。
6.3)添加用户club-user,为此用户添加club-Role角色权限。
新建用户,如下图。此用户的权限即可拥有管理项目的部署权限。
7. 完成了nexus的仓库、用户权限的配置后,需要将用户信息配置在文件中。需要配置的文件有两个。
7.1)需要配置的第一个文件:project.pom.xml。添加下面的配置,指明项目发布需要放置的仓库url:
<distributionManagement>
<repository>
<id>club-module1-release</id>
<name>Club Module Release</name>
<url>http://10.25.119.18:8081/nexus/content/repositories/club-releases/</url>
</repository>
<snapshotRepository>
<id>club-module1-snapshot</id>
<name>Club Module1 Snapshot</name>
<url>http://10.25.119.18:8081/nexus/content/repositories/club-snapshots/</url>
</snapshotRepository>
</distributionManagement>
7.2)配置第二个文件:${user_home}/.m/settings.xml,添加<servers>标签中添加如下配置,指明发布项目时需要的用户名密码:
<server>
<id>club-module1-release</id>
<username>club</username>
<password>club123</password>
</server>
<server>
<id>club-module1-snapshot</id>
<username>club</username>
<password>club123</password>
</server>
这样就算配完了。
原文:https://blog.csdn.net/lh87522/article/details/43281281