为什么要使用 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, 你可以根据个人喜好选择不同的产品。
- Apache Archiva (open source)
- JFrog Artifactory Open Source (open source)
- JFrog Artifactory Pro (commercial)
- Sonatype Nexus OSS (open source)
- Sonatype Nexus Pro (commercial)
在这里,我们选择 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 | D:\Program Files\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin>nexus |
简单说明下各个命令的含义:
命令 | 作用 |
---|---|
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 | D:\Program Files\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin>nexus install |
至此 Nexus OSS 已经安装成 windows 服务,服务启动后,可以通过如下地址访问(Jetty 默认端口号:8081):
http://localhost:8081/nexus/
登录 Nexus OSS
用浏览器打开网址 http://localhost:8081/nexus/ 会看到如下界面:
这个界面是非登录用户看到的效果,左侧菜单栏可以搜索 artifact 和查看 Repository ,右侧中间搜索区域同样可以进行 artifact 的搜索。
点击右上角的【Log In】,使用默认的用户名:admin ,密码:admin123 登录后,则可以看到更多的功能:
Nexus 预置的仓库
点击左侧菜单【Repositories】,查看 Nexus 内置的仓库:
Nexus 的仓库分为这么几类:
- hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 Oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
- proxy 代理仓库:代理公共的远程仓库;
- virtual 虚拟仓库:用于适配 Maven 1;
- group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
添加代理仓库
Add Repository Dropdown:
Add Repository:
将仓库添加到仓库组
搜索 artifact
为了更好的使用 Nexus 的搜索,我们可以设置所有 proxy 仓库的 Download Remote Indexes 为 true,即允许下载远程仓库索引。
索引下载成功之后,在 Browse Index 选项卡下,可以浏览到所有已被索引的构件信息,包括坐标、格式、Maven 依赖的 xml 代码:
有了索引,我们就可以搜索了:
关键字搜索:
GAV 搜索:
将 Oracle 数据库驱动添加到 3rd party
由于 Oracle 授权问题,Maven 中央仓库本身并不包含 Oracle 的 jdbc 驱动,因此,需要我们手动将下载好的 jar 包上传到 Nexus:
配置 Gradle 使用 Nexus
一般使用 Gradle 的时候(Windows平台下),
我们都会新增系统环境变量 GRADLE_USER_HOME ,
并设置其值为非系统盘下的某个目录(用于缓存 Gradle 下载的 artifact,默认是缓存在 USER_HOME/.gradle 目录下 ),
这样做是为了减少对系统盘空间的占用。
从 Nexus 下载依赖的 artifact:
在 build.gradle 中添加 Nexus 仓库地址:1
2
3
4
5repositories {
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
56apply 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
3nexusUrl=http://localhost:8081/nexus
nexusUsername=admin
nexusPassword=admin123
配置 HTTP 代理
一般科技公司都会有一个代理,用来访问被墙的网站(比如: Google、Facebook、Maven Center 之类的网站), Nexus OSS 可以在 【Administration > Server > Default HTTP Proxy Settings(optional)】中进行 HTTP Proxy 的配置:
更多…
更多内容,比如权限设置等,请参考官方教程:Repository Management with Nexus