使用 Nexus 搭建 Maven 私服

Nexus Deployment Processes

为什么要使用 Repository Manager

A repository manager serves these essential purposes:

  • act as dedicated(专注的) proxy server for public Maven repositories(专业的代理仓库)
  • provide repositories as a deployment destination for your Maven project outputs(为 Maven 项目的输出提供了环境)

使用 Repository Manager 来管理 binary 文件的好处大概如下:

  • significantly reduced number of downloads off remote repositories, saving time and bandwidth resulting in increased build performance
  • improved build stability due to reduced reliance on external repositories
  • increased performance for interaction with remote SNAPSHOT repositories
  • potential for control of consumed and provided artifacts
  • creates a central storage and access to artifacts and meta data about them exposing build outputs to consumer such as other projects and developers, but also QA or operations teams or even customers
  • provides an effective platform for exchanging binary artifacts within your organization and beyond without the need for building artifact from source

简单翻译一下:

  • 减少了从远程仓库下载 artifact 的次数,节省时间和带宽(比如:中国大陆访问 Maven Center 就非常慢);
  • 减少对外部仓库的依赖,保障构建的稳定性;
  • 提升了与远程快照仓库的交互;
  • 潜在控制了 artifacts 的来源;
  • 为“用户”提供了统一存储的地方;
  • 促进了 binary artifacts 的循环利用(避免重复打包)。

可选的 Repository Managers

下面是常用的 Maven Repository Managers, 你可以根据个人喜好选择不同的产品。

在这里,我们选择 Nexus OSS。

前期准备

Nexus 官网:http://www.sonatype.com/
Nexus OSS(Open Source Software) 下载地址:http://www.sonatype.org/nexus/go/

在 Windows 平台下选择 NEXUS OSS (ZIP) 版本进行下载。

安装 Nexus OSS

将下载的压缩包 nexus-2.11.4-01-bundle.zip 解压到任意目录(一般放在程序经常安装的目录里)。
在命令行下切换目录到 nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin ,输入nexus命令,效果如下:

1
2
3
D:\Program Files\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin>nexus
Usage: nexus { console : start : stop : restart: install : uninstall }
请按任意键继续...

简单说明下各个命令的含义:

命令 作用
nexus console 以控制台的方式启动 nexus ,控制台关闭的同时 nexus 也就不可用了
nexus start 启动 nexus 服务 (要先安装服务:nexus install)
nexus stop 停止 nexus 服务
nexus restart 重新启动 nexus 服务
nexus install 安装 nexus 服务
nexus uninstall 卸载 nexus 服务

一般我们要先运行 nexus install 将程序安装成 windows 服务,然后通过 nexus start 来启动服务,操作如下:

1
2
3
4
5
6
7
8
D:\Program Files\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin>nexus install
wrapper | nexus installed.

D:\Program Files\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin>nexus start
wrapper | Starting the nexus service...
wrapper | Waiting to start...
wrapper | Waiting to start...
wrapper | nexus started.

至此 Nexus OSS 已经安装成 windows 服务,服务启动后,可以通过如下地址访问(Jetty 默认端口号:8081):
http://localhost:8081/nexus/

登录 Nexus OSS

用浏览器打开网址 http://localhost:8081/nexus/ 会看到如下界面:
Nexus Home
这个界面是非登录用户看到的效果,左侧菜单栏可以搜索 artifact 和查看 Repository ,右侧中间搜索区域同样可以进行 artifact 的搜索。

点击右上角的【Log In】,使用默认的用户名:admin ,密码:admin123 登录后,则可以看到更多的功能:
Nexus Home

Nexus 预置的仓库

点击左侧菜单【Repositories】,查看 Nexus 内置的仓库:
Nexus Repositories

Nexus 的仓库分为这么几类:

  • hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 Oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
  • proxy 代理仓库:代理公共的远程仓库;
  • virtual 虚拟仓库:用于适配 Maven 1;
  • group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。

Nexus Repository Group

添加代理仓库

Add Repository Dropdown:
Add Repository Dropdown

Add Repository:
Add Repository

将仓库添加到仓库组

Add to Group

搜索 artifact

为了更好的使用 Nexus 的搜索,我们可以设置所有 proxy 仓库的 Download Remote Indexes 为 true,即允许下载远程仓库索引。
Download Remote Index
索引下载成功之后,在 Browse Index 选项卡下,可以浏览到所有已被索引的构件信息,包括坐标、格式、Maven 依赖的 xml 代码:
Browse Index
有了索引,我们就可以搜索了:
Search Summary
关键字搜索:
Search
GAV 搜索:
Advanced Search

将 Oracle 数据库驱动添加到 3rd party

由于 Oracle 授权问题,Maven 中央仓库本身并不包含 Oracle 的 jdbc 驱动,因此,需要我们手动将下载好的 jar 包上传到 Nexus:
Nexus Upload Artifact

配置 Gradle 使用 Nexus

一般使用 Gradle 的时候(Windows平台下),
我们都会新增系统环境变量 GRADLE_USER_HOME ,
并设置其值为非系统盘下的某个目录(用于缓存 Gradle 下载的 artifact,默认是缓存在 USER_HOME/.gradle 目录下 ),
这样做是为了减少对系统盘空间的占用。

从 Nexus 下载依赖的 artifact:
在 build.gradle 中添加 Nexus 仓库地址:

1
2
3
4
5
repositories {
maven {
url "http://127.0.0.1:8081/nexus/content/grioups/public"
}
}

将新项目的 artifact 上传到 Nexus:
项目根目录下的 build.gradle 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
apply plugin: 'java'
apply plugin: 'maven'

group = 'org.sonatype.nexus.examples'
version = '1.0.0-SNAPSHOT'
// version = '1.0.0-RELEASE'

repositories {
maven {
url "${nexusUrl}/content/groups/public"
}
}

dependencies {
testCompile "junit:junit:3.8.1"
compile "org.jbundle.util:org.jbundle.util.jbackup:2.0.0"
compile "net.sf.webtestfixtures:webtestfixtures:2.0.1.3"
compile "org.shoal:shoal-gms-api:1.5.8"
compile "org.ow2.util:util-i18n:1.0.22"
compile "com.sun.grizzly:grizzly-lzma:1.9.19-beta5"
compile "org.codehaus.sonar:sonar-squid:2.9"
compile "org.graniteds:granite-openjpa:2.2.0.SP1"
compile "org.apache.tomcat:tomcat-util:7.0.0"
compile "org.apache.camel:camel-http:2.4.0"
compile "org.apache.struts.xwork:xwork-core:2.2.1"
compile "org.jruby:jruby-complete:1.1RC1"
compile "org.jruby:jruby:1.6.3"
compile "org.mortbay.jetty:jetty:6.1.16"
compile "org.apache.derby:derby:10.1.2.1"
compile "org.springframework:spring-web:3.1.1.RELEASE"
compile "com.google.code.facebookapi:facebook-java-api:3.0.4"
compile "com.google.guava:guava:12.0"
compile "com.google.guava:guava-gwt:12.0"
compile "biz.littlej.jreqs:jreqs-guava:0.1.1"
compile "org.sonatype.sisu:sisu-ehcache:1.1"
compile "org.sonatype.sisu:sisu-xmlrpc-client:1.2.0"
compile "com.googlecode:kiama_2.8.1:1.0.2"
compile "com.googlecode:jyield:0.0.6"
}

uploadArchives {
repositories {
mavenDeployer {
repository(url: "${nexusUrl}/content/repositories/releases") {
authentication(userName: nexusUsername, password: nexusPassword)
}
snapshotRepository(url: "${nexusUrl}/content/repositories/snapshots") {
authentication(userName: nexusUsername, password: nexusPassword)
}
}
}
}

task wrapper( type: Wrapper, description: "create a gradlew" ) {
gradleVersion = '2.0'
}

与 build.gradle 同目录下的 gradle.properties 内容如下:

1
2
3
nexusUrl=http://localhost:8081/nexus
nexusUsername=admin
nexusPassword=admin123

配置 HTTP 代理

一般科技公司都会有一个代理,用来访问被墙的网站(比如: Google、Facebook、Maven Center 之类的网站), Nexus OSS 可以在 【Administration > Server > Default HTTP Proxy Settings(optional)】中进行 HTTP Proxy 的配置:
Nexus Server HTTP Proxy

更多…

更多内容,比如权限设置等,请参考官方教程:Repository Management with Nexus

参考文献