前言
Sonatype家的NexusMaven是Java项目管理的利器,使用私服来管理Maven仓库是Maven使用的一条最佳实践。私服是内网的“远程仓库”,可以代理Maven中央仓库 下载artifact或部署第三方artifact。当 Maven 需要下载artifact时,可直接请求私服,从私服上将artifact下载到本地Maven仓库。由此可见,私服可以节省时间和带宽,是一个Java开发团队必不可少的一种工具。
如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下 载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到maven仓库怎么 办呢?开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的maven私服,这样既节省了网络带宽也会加速项目搭建的进程, 当然前提条件就是你的私服中拥有项目所需的所有构件。
没有私服的情况下使用Maven下载依赖包 有私服的情况下使用Maven下载依赖包既然私服这么好,那我们应该如何搭建私服呢?这里我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。
其中,Nexus提供了强大的仓库管理功能,artifact搜索功能,基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。
综合比较Sonatype的Nexus,是最适合我使用的,因此,本文重点介绍基于Nexus来搭建的Maven私服。
安装
本文所描述的安装环境是针对Linux的,ubuntu14\16和CentOS6\7都测试可用。windows的安装方法会简便一些,主要就是执行*.exe文件即可。
Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。(NEXUS OSS = Open Source Software,NEXUS PROFESSIONAL -FREE TRIAL )Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。(下载页面是:https://www.sonatype.com/download-oss-sonatype)
在这里,我选择bundle包,来进行安装。输入如下命令,下载安装包,然后解压缩,
解压缩出的nexus里面有2个文件夹,第一个文件夹是核心文件,第二个文件夹用来存储下载下来的jar:
image.png然后,执行下方的操作便可以将nexus启动。此处说明一下,通过wget http://www.sonatype.org/downloads/nexus-latest-bundle.tar.gz下载的包,默认会是最新的包,也就是下文提到的nexus-2.14.10-01
wget http://www.sonatype.org/downloads/nexus-latest-bundle.tar.gz
tar xfvz nexus-latest-bundle.tar.gz
root@m01:~# cd nexus-2.14.10-01/
root@m01:~/nexus-2.14.10-01# ls
bin conf lib LICENSE.txt logs nexus NOTICE.txt tmp
root@m01:~/nexus-2.14.10-01/bin# ls
jsw nexus nexus.bat
root@m01:~/nexus-2.14.10-01/bin#
root@m01:~/nexus-2.14.10-01/bin# ./nexus start
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
Starting Nexus OSS...
Started Nexus OSS.
启动之后,还应该将nexus作为linux开机自动启动的服务。我们需要修改rc.local文件,vim /etc/rc.local,linux在启动的时候,会读取这个服务。记得将启动的脚本写在exit 0;
之前
vim /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sh /root/nexus/bin/nexus start &
exit 0
image.png
注意:如果有如上报错,需要修改运行的用户,修改运行文件 nexus,命令:vim nexus,将RUN_AS_USER修改为root
vim nexus
..
....
RUN_AS_USER=root
访问Nexus
Nexus服务器的默认端口是8081,
安装好Nexus后,可以通过http://localhost:8081来访问nexus服务器。如果想要修改Nexus的启动端口等参数,进入nexus/conf目录下,编辑nexus.properties文件
#
# Sonatype Nexus (TM) Open Source Version
# Copyright (c) 2008-present Sonatype, Inc.
# All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions.
#
# This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0,
# which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html.
#
# Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks
# of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the
# Eclipse Foundation. All other trademarks are the property of their respective owners.
#
# Sonatype Nexus
# ==============
# This is the most basic configuration of Nexus.
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus
runtime=${bundleBasedir}/nexus/WEB-INF
# orientdb buffer size in megabytes
storage.diskCache.bufferSize=4096
nexus的默认登录用户名和密码是:admin/admin123,我们可以通过右上角的Log In登录到系统中
nexus的界面登录后,记得修改你的超级管理员用户的密码。通过下方的users进入,并修改。
记得修改你的超级管理员用户的密码
或者进入profile下进行修改
记得修改你的超级管理员用户的密码仓库
分类
仓库类型 | 描述 | 说明 |
---|---|---|
hosted | 宿主仓库 | 要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件 |
proxy | 代理仓库 | 代理公共的远程仓库 |
virtual | 虚拟仓库 | 用于适配 Maven 1 |
group | 仓库组 | Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。 |
接下来,我们点击左侧 Repositories 链接,查看 Nexus 内置的仓库:
image.png简单介绍一些默认内部仓库实例:
仓库默认实例 | 描述 | 说明 |
---|---|---|
Public Repositories | 仓库组 | 与group概念相对应 |
3rd party | 第三方库 | 无法从公共仓库获得的第三方发布版本的构件仓库 |
Apache Snapshots | Apache快照 | 用了代理ApacheMaven仓库快照版本的构件仓库 |
Central | 中央仓库 | 用来代理maven中央仓库中发布版本构件的仓库 |
Central M1 shadow | 虚拟的M1仓库 | 用于提供中央仓库中M1格式的发布版本的构件镜像仓库 |
Codehaus Snapshots | Codehaus仓库快照 | 用来代理CodehausMaven 仓库的快照版本构件的仓库 |
Snapshots | 组内快照 | 用来部署管理内部的发布版本构件的宿主类型仓库 |
Releases | 组内发布版 | 用来部署管理内部的快照版本构件的宿主类型仓库 |
配置
下载远程中央仓库索引
下载中央仓库的索引,便于查询构建;
为了保障中央仓库可用,我们要进入名为 Central 的资源库,在其配置页面,将远程下载索引调整为 true 。
image.png这时,进入任务调度页面,可以看到一个修复资源库索引的任务正在运行。这个任务是由于资源库的配置变更自动触发的,执行一次,执行完会自动删除,作用是将 Maven 中央仓库的索引(目前,大概 2.6 G ,并且还在增加)下载到私服,一般要执行 1-2 小时,具体执行时长依赖实际网络环境。
image.png配置开发机器Maven
配置 Maven ,设置本地仓库和私服地址,这样本地的每一个 Maven 项目都可以连接到私服,免去每个项目都要指定私服地址的烦恼。
为了在本地项目中使用到 Nexus 私服,需要为本地 Maven 进行相应配置。也就是需要配置%M2_HOME%\conf\settings.xml
配置本地仓库
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
如果不设置localRepository,maven会默认将本地仓库建到/.m2/repository文件夹下。
建议:针对每一个项目的Maven仓库不用默认仓库,指定仓库地址到其他盘符,将下载的包单独管理起来。当然,前提是你的settings.xml也是针对某套系统独立出来的,否则就是全局设置了。
我来设置一个自己的私人仓库
<localRepository>c:\privateRepository</localRepository>
在pom.xml中配置Nexus仓库
<repositories>
<repository>
<id>nexus</id>
<name>my-nexus-repository</name>
<url>http://0.0.0.0/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>my-nexus-repository</name>
<url>http://0.0.0.0/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
注意:配置pom.xml文件只对当前工程有效,如果是微服务项目,则会有多个工程,这样配置就会出现重复性工作,所以,如果是有很多工程的项目,不建议在pom.xml文件中配置Nexus。
在setting.xml文件中配置Nexus仓库
使用profile来配置仓库信息
<profiles>
<profile>
<id>myprofile</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
然后,激活profile
<activeProfiles>
<activeProfile>myprofile</activeProfile>
</activeProfiles>
还需要配置镜像
<mirrors>
<mirror>
<id>nexus</id>
<url>http://0.0.0.0/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
这里配置mirrorOf的值为*,代表maven的所有访问请求都会指向到Nexus仓库组。
使用Nexus
pom.xml
在pom文件中添加配置
<distributionManagement>
<repository>
<id>private-nexus-releases</id>
<url>http://0.0.0.0/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>private-nexus-snapshot</id>
<url>http://0.0.0.0/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
setting.xml中添加认证信息
<servers>
<server>
<id>private-nexus-releases</id>
<username>private-user-name</username>
<password>**************</password>
</server>
<server>
<id>private-nexus-snapshot</id>
<username>private-user-name</username>
<password>**************</password>
</server>
</servers>
执行Maven部署
首先需要配置好pom.xml的项目坐标
<groupId>com.bayan</groupId>
<artifactId>test</artifactId>
<version>0.0.1-snapshot</version>
<packaging>jar</packaging>
<name>mytest</name>
通过这个配置,构件会部署到snapshot仓库中
执行mvn clean deploy
,如果执行成功就会在snapshot仓库中,看到该jar包。
参考
本文内容参考了如下文章,在此感谢各位作者的辛勤劳动和无私奉献。
1.Nexus安装、使用说明、问题总结
2.Nexus安装、使用说明
3.史上最全使用Nexus搭建Maven服务器详细配置
4.Nexus Repository 搭建及使用
网友评论