1、私服简介
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当Maven需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
我们可以使用专门的Maven仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus。
本文以Windows系统为例。
2、Nexus下载
官网:https://www.sonatype.com/
下载地址:https://www.sonatype.com/nexus-repository-oss
或:https://www.sonatype.com/oss-thank-you-win64.zip
官方文档:https://help.sonatype.com/repomanager3
下载的时候选择Nexus Repository OSS,带Pro的是收费版。
根据自己的系统选择对应版本,支持OS X,Windows,Unix三大系统。
如下图所示:
最新的3.x版本除了支持Maven,还支持Bower,Docker,Git,npm,NuGet等等。
3、本机环境说明及安装包
操作系统:Windows 7
JDK版本:1.8
Maven版本:3.5.0
Maven安装目录:C:\Program Files\Java\apache-maven-3.5.0-bin
Nexus版本:3.15.1-01
Nexus安装目录:C:\Program Files\Java\nexus-3.15.1-01-win64
开发工具:Eclipse Java EE IDE for Web Developers 4.7.0
4、解压安装包
直接解压到指定目录即可(建议:但是Windows用户需注意目录路径不能含有中文,空格等字符),如下图。
文件夹说明:
nexus-3.15.1-01:安装目录
sonatype-work:工作目录
5、服务配置
Nexus自带jetty,默认端口8081,可能会有端口冲突,找到配置文件修改即可。
进入到Nexus安装目录下的nexus-3.15.1-01\etc 文件夹内的nexus-default.properties文件,其文件内容如下:
只需修改application-port的值即可。
配置系统环境变量(选择性配置):
可以将Nexus的bin目录添加到Path环境变量中,这里不做介绍。
添加目录为:C:\Program Files\Java\nexus-3.15.1-01-win64\nexus-3.15.1-01\bin
6、安装启动
启动有两种方法,一是直接启动,二是安装成服务。
都先进入安装目录,打开cmd命令窗体,输入如下命令:
cd "C:\Program Files\Java\nexus-3.15.1-01-win64\nexus-3.15.1-01\bin"
(因本机安装在有空格的目录下,故使用英文的双引号包裹起来)
直接启动,输入:nexus.exe /run
注意:如果出现错误例如:Error occurred during initialization of VM或java.lang.NumberFormatException: null,则可能是JDK版本不对(未安装或升级高版本),或路径中带中文。
第一次启动比较慢,等到打印出以下内容,则表示启动成功:
如想停止,直接按Enter就可以停止服务。
安装成Windows服务:输入:nexus.exe /install nexus-3.15.1-01
安装完毕后,可以直接在服务里面启动,也可以使用下面的命令启动:nexus.exe /start nexus-3.15.1-01
通过nexus.exe /stop nexus-3.15.1-01停止Nexus服务。
卸载Windows服务,输入:nexus.exe /uninstall nexus-3.15.1-01
7、访问系统
打开浏览器,输入地址:http://localhost:8081/
点击右上角Sign in,输入账号密码,默认账号是 admin,密码:dmin123。
界面稍有变化:
8、查看Nexus中的仓库
点击左侧Browse,查看 Nexus 内置的仓库:
maven-central:代理中央仓库、策略为Release、只会下载和缓存中央仓库中的发布版本构件。
maven-releases:策略为Release的宿主仓库、用来部署组织内部的发布版本内容。
maven-snapshots:策略为Snapshot的宿主仓库、用来部署组织内部的快照版本内容。
maven-public:该仓库将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。
nuget-hosted:用来部署nuget构件的宿主仓库。
nuget.org-proxy:代理nuget远程仓库,下载和缓冲nuget构件。
nuget-group:该仓库组将nuget-hosted与nuget.org-proxy仓库聚合并通过一致的地址提供服务。
maven-public:该仓库组将maven-central,maven-releases与maven-snapshots仓库聚合并通过一致的地址提供服务。
在Maven中配置的访问Nexus的仓库一般是maven-public仓库组,向仓库组下载或者上传构件的请求,仓库组中没有实际的内容,它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容,如下图所示。
或
Repository的Type属性有:hosted,proxy,group三种:
hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
proxy 代理仓库:代理公共的远程仓库;
group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
简单的说,就是你可以上传私有的项目到hosted,以及配置proxy以获取第三方的依赖(比如可以配置中央仓库的地址)。前面两个都弄好了之后,在通过group聚合给客户提供统一的访问地址。
至于Format,本文讲的Maven Repository均选择maven2;
你还可以添加一个国内的私有maven库作为代理,避免中央库无法连接,譬如阿里云:http://maven.aliyun.com/nexus/content/groups/public/
9、管理本地仓库
点击顶部齿轮状按钮,进入配置页面,再点击左边菜单栏中的Repository > Repositories,进入仓库管理页面。
系统默认就有以上几个Repository。点击maven-public 确保已经将 maven-central,maven-releases以及maven-snapshots都包含在里面,如果你自己有自定义库,请确保也在里面,点击maven-public名称,查看信息,如下图:
Nexus涉及的Recipe:
maven-releases:存放我们自己项目中发布的构件,通常是Release版本的,默认配置只能上传 release版本的项目;
maven-snapshots:它的目的是让我们可以发布那些非release版本,非稳定版本,默认配置只能上传 snapshots版本的项目;
nuget开头的库:.net使用的库,java不用管。
如有特殊要求,可以自己创建一个Version policy 为Mixed的Repository。
10、增加仓库(以增加宿主仓库为例)
回到Repositories页面,点击Create repository按钮,选择 Recipe为maven2 (hosted),输入仓库信息,例如:
Name:maven-test-public
Maven 2 > Version policy:Release
Hosted > Deployment policy:Allow redeploy
其余默认即可,点击Create repository按钮,创建宿主仓库。
创建完毕后,可通过点击对应的仓库行数据,进行查阅URL地址,该地址在Maven的settings.xml文件或项目中将引用。
11、角色介绍及添加
Nexus是基于权限(Privilege)做访问控制的。一个用户可以被赋予一个或者多个角色、一个角色可以包含一个或者多个权限、还可以包含一个或者多个角色。用户必须拥有相应的角色继而拥有相应权限、才能做相应操作,但是有一点要注意这里的权限都是基于仓库的,即对仓库的增删改查权限。
在3.x版本中, Nexus只预定义了两个重要的角色:
nx-admin:拥有Nexus所有权限
nx-anonymous:匿名用户角色,拥有访问Nexus界面,浏览仓库内容和搜索构件的功能。
可通过左边菜单中找到 Security > Roles, 点击Create role > Nexus role进行添加新角色,如下:
新增具有浏览仓库内容、搜索构件、组件上传的角色:
Role ID:nx-browse-search-read-upload
Role name:nx-browse-search-read-upload
Role description:具有浏览仓库内容、搜索构件、组件上传的角色
Privileges:nx-component-upload和nx-repository-view-maven2-maven-test-public-*(这里设置具有maven-test-public仓库的权限,否则上传会失败)
Roles:nx-anonymous
12、添加本地用户或修改用户密码
在左边菜单中找到 Security > Users , 点击 Create local user 可添加新用户,如下:
新增管理员用户信息:
ID:testadmin
First name:first
Last name:last
Email:[email protected]
Password:123456
Status:Active
Roles:nx-admin
新增只读且具有上传组件的用户信息:
ID:testreadonlyupload
First name:firstreadonlyupload
Last name:lastreadonlyupload
Email:[email protected]
Password:123456
Status:Active
Roles:nx-browse-search-read-upload
若选择用户后,再点击Change password可进行密码的修改,需要先输入当前登录用户的密码,再输入要修改用户的新密码和确认密码。
补充说明:
admin用户:拥有对Nexus服务完全控制,包括对仓库的配置、创建、删除、更新,用户的账号权限登录管理等。
默认情况下,Nexus私服的仓库是允许匿名(anonymous)访问的,也就是任何开发者只要知道你的仓库地址,都可以远程依赖你发布到仓库的库。既然是私服,可能有些库不想要给其他人访问,可以通过设置凭据访问来限制用户访问远程依赖库,最简单的一种就是用户名密码凭据访问。
去掉匿名访问的步骤:
第一步:打开远程仓库,使用有配置管理的账户登录,打开设置页面;
第二步:定位到“Security > Anonymous”,将“Allow anonymous users to access the server”勾选去掉,保存更改。
13、向Nexus服务器上传项目
首先:准备一个Maven项目的jar
本文章通过eclipse,创建一个名为test-maven-jar的Maven项目,相关信息如下:
archetype:maven-archetype-quickstart
Group Id:com.maven.testproject
ArtifactID:testproject-test
Version:0.0.1
Package:com.maven.testproject
打包后的jar文件:testproject-test-0.0.1.jar
(提示:如果要保留注释,可通过右击项目 > Export > Java > JAR file进行导出,并勾选 Export Java source files and resources)
目录结构如下:
其次,进行Maven的setting.xml文件配置,在settings节点下配置servers和mirrors节点信息,脚本如下:
<servers>
<server>
<id>nexus_3_15_1_01id>
<username>testreadonlyuploadusername>
<password>123456password>
server>
servers>
<profiles>
<profile>
<id>profile_nexus_3_15_1_01id>
<repositories>
<repository>
<id>repository_nexus_3_15_1_01id>
<url>http://localhost:8081/repository/maven-test-public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
repositories>
profile>
profiles>
<activeProfiles>
<activeProfile>profile_nexus_3_15_1_01activeProfile>
activeProfiles>
如下图:
方式一:使用cmd上传
命令:mvn deploy:deploy-file -DgroupId=xxx.xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=jar -Dfile=D:\xxx.jar -Durl=http://xxx.xxx.xxx.xxx:8081/repository/maven-releases/ -DrepositoryId=nexus
参数说明:
mvn deploy:deploy-file
-DgroupId:为上传的jar的groupId(相当于pom中的groupId);
-DartifactId:为上传的jar的artifactId(相当于pom中的artifactId);
-Dversion:为上传的jar的需要被依赖的时候的版本号(相当于pom中的版本号version);
-Dpackaging:为上传包的格式(相当于pom中打包方式),例如:jar、war;
-Dfile:为jar包路径;
-Durl:为要上传的路径,例如:私服的仓库地址;
-DrepositoryId:对应Maven中setting.xml内容下的server id;
-s:setting.xml的路径(如果使用默认conf中的setting,则无需配置)。
注意:-Dfile中的路径最好就在任意磁盘的根目录,例如:D:\xxx.jar,不要D:\xxx\xxx\xxx\xxx.jar,这样可能会报错。
命令例如:mvn deploy:deploy-file -DgroupId=com.maven.testproject -DartifactId=testproject-test -Dversion=0.0.1 -Dpackaging=jar -Dfile=D:\testproject-test-0.0.1.jar -Durl=http://localhost:8081/repository/maven-test-public/ -DrepositoryId=nexus_3_15_1_01
执行结果如下图:
查看上传成功后的信息:
方式二:使用开发工具上传
修改项目中的pom.xml文件,添加与dependencies属于同一级别的distributionManagement节点,如下:
<dependencies>
...
dependencies>
<distributionManagement>
<repository>
<id>nexus_3_15_1_01id>
<name>central repositoryname>
<url>http://localhost:8081/repository/maven-test-public/url>
repository>
distributionManagement>
如下图所示:
此时,选择项目右键 > Run As > Maven build…(第二个),将弹出窗体,在Goals中输入“deploy”,点击Run按钮。
查看上传成功后的信息:
注意:在项目pom.xml文件中的开头一段声明,其实maven是通过版本号version中是否带有“-SNAPSHOT”来判断是快照版本还是正式版本;如果想发布正式版本把“-SNAPSHOT”去掉只留版本号即可,加上之后即为快照版本。其中,这里的SNAPSHOT一定要大写。
方式三:使用网页上传
回到Browse server contents界面,再点击左边菜单中的Upload,进行上传jar包。
选择要上传的仓库:maven-test-public,上传文件并填写相关信息,点击Upload。
14、Maven项目引用私服上的包
修改项目中的pom.xml文件,在dependencies节点内添加dependency节点信息,如下:
<dependency>
<groupId>com.maven.testprojectgroupId>
<artifactId>testproject-testartifactId>
<version>0.0.1version>
dependency>
如下图所示:
其中dependency信息可由Nexus上获取得到,如下图:
配置完毕后,可通过选择项目右键 > Run As > Maven install,即可自动从私服上下载对应的包到本地。
提醒:如果生成失败,则登录Nexus查看Anonymous信息,在左边菜单中点击Security > Anonymous,将“Allow anonymous users to access the server”勾选,保存更改,回到项目重新生成试试。
参考文章:
https://blog.csdn.net/chenfei2341/article/details/80431700
https://blog.csdn.net/cool_summer_moon/article/details/78779530
https://www.cnblogs.com/bingyeh/p/5913486.html
https://blog.csdn.net/yingaizhu/article/details/83007747
https://blog.csdn.net/hellow__world/article/details/71855883
https://blog.csdn.net/sinat_39789638/article/details/77918292
https://blog.csdn.net/qq_16313365/article/details/78059895