
When you search for artifacts using http://repository.sonatype.org, the browser is querying the Nexus repository using a REST API. In this post, I’m going to show you some simple Ruby scripts which you can use to search the Maven repository ...
If you are looking for the easiest way to search for artifacts in the Central Maven Repository, go to http://repository.sonatype.org. Sonatype maintains a publi instance of Nexus that can be used to search for artifacts by GAV (groupId, artifactId...
A common question from Apache Maven users is “How do I search the central repository?” or “How do I find out what groupId or artifactId I should use for a specific dependency?” Use Sonatype’s Nexus installation at htt...
One of the users on the m2eclipse user list has some great feedback about a presentation he did at the Stockholm JUG on the best of breed Maven tooling which includes Nexus and m2eclipse. Apparently people are impressed with the Maven support insi...
Maven 3.0 uses a new standalone component that handles inheritance and interpolation of a model in any format. The model needn’t even be XML based. If you can translate your model into a list of property-value pairs, you can use this framewo...
There’s are lots of people who already know that Mark de Visser is the new CEO of Sonatype, but Zack wrote a nice bit about it today in his InfoWorld blog: http://weblog.infoworld.com/openresource/archives/2008/11/marketing_maven.html I am r...
仓库管理器有两个服务目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织内部生成的构件的地方。
代理Maven仓库有很多好处。对于一开始使用Maven的情况来说,通过为所有的来自中央Maven仓库的构件安装一个本地的缓存,你将加速组织内部的所有构建。如果有开发人员想要下载 Spring Framework 的2.5版本,并且你在使用Nexus,那些依赖(以及依赖的依赖)只需要从远程仓库下载一次。如果有一个高速的 Internet 网络连接,这看起来没什么大不了,但是如果你一直要求你的开发人员去下载几百兆的第三方依赖,那么真正节省的时间将会是Maven检查依赖新版本以及下载依赖的时间。通过本地仓库提供Maven依赖服务可以节省数百的HTTP请求,在大型的多项目构建中,这样可以为一次构件节省几分钟的时间。
除了简单的时间和带宽的节省,仓库管理器为组织提供了一种控制Maven下载的机制。你可以详细的设置从公开仓库包含或排除特定的构件。能够控制从核心Maven仓库的下载对于很多组织来说是经常是一个必要前提,它们需要维护一个组织中使用依赖的严格控制。一个想要标准化某个如Hibernate或者Spring依赖版本的组织可以通过在仓库管理器中仅仅提供一个特殊版本的构件来加强这种标准。还有一些组织可能关心确保所有外部的依赖拥有和组织的法律规范相容的许可证。如果一个企业生产了一个分发应用程序,它们可能想要确定没有人不小心添加了一个涉及GPL许可证的依赖。仓库管理器为那些需要确信总体架构和政策实施的组织提供了这一层次的控制。
除了控制对远程仓库的访问以外,仓库管理器也为Maven的全面使用提供了一些很至关重要的东西。除非你希望你组织的每一个成员下载并构建一个单独的内部项目,否则你会希望为开发人员和部门之间提供一种共享内部项目构件的快照版本和发布版本的机制。Nexus为你的组织提供了这样的部署目标。在你安装了Nexus之后,你可以开始使用Maven让它部署快照版和发布版至一个由Nexus管理的定制仓库。
Tamas Cservenak 在2005年12月开始为Proximity工作,当时他正想办法将它自己的系统和由Hungarian ISP提供的慢得难以置信的ADSL连接隔离开。Proximity以一个简单web应用的形式启动,用来为有网络连接问题的小型组织代理构件。为Maven构件创建一个对中央核心仓库的本地的命令驱动的缓存,能让组织访问来自中央核心仓库的构件,而且它同时也能确保这些构件不会通过很慢的ADSL连接来下载,要知道很多开发人员在使用这个连接。在2007年,Sonatype请求Tamas帮助创建一个类似的名为Nexus的产品。Nexus目前可以被认为是Proximity逻辑上的下一个步伐。
Nexus目前有一个活动的开发团队包括Tamas Cservenak,Max Powers,Dmitry Platonoff 和Brian Fox。Nexus的关于索引的部分代码也同时在m2eclipse中被使用,这些代码目前由Eugene Kuleshov开发。
你可以从http://nexus.sonatype.org找到关于Nexus的信息。要下载Nexus,访问http://nexus.sonatype.org/downloads/。点击下载链接,下载适用于你平台的存档文件。Nexus目前有ZIP和Gzip归档的TAR两种可用形式。
安装Nexus很简单,打开Nexus归档文件至一个目录。如果你正在本地工作站上安装Nexus,以测试它的运行,你可以将其安装至你的用户目录,或者随便什么你喜欢的地方;Nexus没有任何硬编码的目录,它能在任意目录运行。如果你下载了一个ZIP归档文件,运行:
$ unzip nexus-1.0.0-beta-3-bundle.zip如果你下载了GZip归档的TAR文件,运行:
$ tar xvzf nexus-1.0.0-beta-3-bundle.tgz如果你正在一个服务器上安装Nexus,你可能想要使用的目录不是你的用户目录。在Unix机器上,这可能是/usr/local/nexus-1.0.0-beta-3和一个指向Nexus目录的符号链接/usr/local/nexus。使用一个通用的符号链接来指向Nexus的某个特定版本是一个普遍的实践,它能让你更容易的将Nexus更新至最新的版本。
$ sudo cp nexus-1.0.0-beta-3-bundle.tgz /usr/local $ cd /usr/local $ sudo tar xvzf nexus-1.0.0-beta-3-bundle.tgz $ ln -s nexus-1.0.0-beta-3 nexus
虽然对于Nexus的运行来说这不是必要的,你可能想要设置一个环境变量NEXUS_HOME,指向Nexus的安装目录。本章通过${NEXUS_HOME}的形式来引用这个位置。
当你启动Nexus,就是启动一个web服务器,它的默认地址是localhost:8081。Nexus在一个名为Jetty的servlet容器中运行,它使用一个名为Tanuki
Java Service
Wrapper的本地服务包裹器启动。这个服务包裹器可以被配置成以Windows服务或Unix守护线程的形式运行Nexus。要启动Nexus,你需要为你的平台找到合适的启动脚本。要查看可用平台的列表,查看${NEXUS_HOME}/bin/jsw目录的内容。
下面的例子展示了使用Mac
OSX的脚本启动Nexus。首先我们列出${NEXUS_HOME}/bin/jsw的内容以查看可用的平台,然后我们用chmod命令使这个bin目录的内容可执行。Mac
OSX包裹器通过调用app
start启动,然后我们tail在${NEXUS_HOME}/container/logs中的wrapper.log。Nexus会初始化自己然后打印出一条信息说明它正在监听localhost:8081。
$ cd Nexus $ ls ./bin/jsw/ aix-ppc-32/ linux-ppc-64/ solaris-sparc-32/ aix-ppc-64/ linux-x86-32/ solaris-sparc-64/ hpux-parisc-32/ linux-x86-64/ solaris-x86-32/ hpux-parisc-64/ macosx-universal-32/ windows-x86-32/ $ chmod -R a+x bin $ ./container/bin/jsw/macosx-universal-32/app start Nexus Repository Manager... $ tail -f container/logs/wrapper.log INFO ... [ServletContainer:default] - Started SelectChannelConnector@0.0.0.0:8081
到目前为止,Nexus已经开始运行并监听端口8081。要使用Nexus,启动一个web浏览器然后输入URL:http://localhost:8081/nexus。点击web页面右上角的“Log In”链接,你应该看到如下的登陆对话框。
默认的NEXUS用户名和密码是"admin" 和 "admin123"。
Nexus带有默认的密码和仓库索引设置,它们都需要更改以满足你的安装需要(以及安全)。安装完并运行了Nexus后,你需要确认你完成了下列任务:
默认的管理密码是admin123。对一个全新的Nexus安装,你首先要做的是更改这个密码。要更改默认的管理员登陆名"admin"及密码"admin123",在浏览窗口的左边导航菜单中的Security部分点击Change
Password。
Nexus可以发送用来用户名和密码的email,要开启这个特性,你需要用SMTP主机和端口配置Nexus,以及相关的Nexus用来连接邮件服务器的认证参数。为此,载入如Section 16.5., “定制服务器配置”中的服务器配置对话框。
Nexus带有三个重要的代理仓库,有中央Maven仓库,Apache快照仓库,和Codehaus快照仓库。它们中的每一个仓库都包含了数千(或数万)的构件,下载每个仓库的所有内容是不切实际的。处于这个原因,大部分仓库维护了一个编录了整个内容的Lucene索引,以提供快速和有效的搜索。Nexus使用这些远程索引搜索构件,但是默认设置我们关闭了索引下载。要下载远程索引,
点击Administration菜单下面的Repositories,更改三个代理仓库的Download Remote Indexes为true。你需要为此载入如Section 16.6, “维护仓库”中的对话框。
在每个代理仓库上右击然后选择Re-index。这会触发Nexus下载远程的索引文件。
Nexus下载整个索引可能需要好几分钟,但是一旦你下载好之后,你就能够搜索Maven仓库的所有内容了。
Sonatype想要确信没有创建一个会在默认情况下对中央仓库造成大量拥挤的产品。虽然大部分用户会想要开启远程索引下载,我们还是不想使之成为默认设置,当数百万用户下载一个新版本的Nexus继而不断的下载这个21MB的中央索引的时候,会制造对我们自己的拒绝服务攻击。如果你想要Nexus返回全部的搜索结果,你就必须显式的开启远程索引下载。
你可以将Nexus配置成自动启动,通过将app脚本拷贝到/etc/init.d目录。在一个Redhat变种的Linux系统上(Redhat,
Fedora, 或者 CentOS),以root用户执行下列操作:
复制${NEXUS_HOME}/bin/jsw/linux-ppc-64/app,或${NEXUS_HOME}/bin/jsw/linux-x86-32/app,或${NEXUS_HOME}/bin/jsw/linux-x86-64/app至/etc/init.d/nexus。
使/etc/init.d/nexus脚本可运行 —— chmod
755 /etc/init.d/nexus。
编辑该脚本,更改下列变量。
更改 APP_NAME 为 "nexus"
更改 APP_LONG_NAME 为 "Sonatype
Nexus"
添加一个变量 NEXUS_HOME 指向你的 Nexus
安装目录
添加一个变量 PLATFORM 内容包含
linux-x86-32,
linux-x86-64, 或
linux-ppc-64
更改 WRAPPER_CMD 为
${NEXUS_HOME}/bin/jsw/${PLATFORM}/wrapper
更改 WRAPPER_CONF 为
${NEXUS_HOME}/conf/wrapper.conf
更改 PIDDIR 为
/var/run.
添加一个 JAVA_HOME 变量指向你的本地 Java 安装
添加 ${JAVA_HOME}/bin 至
PATH
(可选) 设置 RUN_AS_USER 为 "nexus". 如果你这么做,你需要:
创建一个 nexus 用户
更改你的 nexus 安装目录的 Owner 和 Group 为 nexus
最后你应该有一个文件/etc/init.d/nexus,它拥有如下的一些列配置属性(假设你在/usr/local/nexus安装Nexus,你在/usr/java/latest安装了Java):
JAVA_HOME=/usr/java/latest
PATH=${PATH}:${JAVA_HOME}/bin
APP_NAME="nexus"
APP_LONG_NAME="Sonatype Nexus"
NEXUS_HOME=/usr/local/nexus
PLATFORM=linux-x86-64
WRAPPER_CMD="${NEXUS_HOME}/bin/jsw/${PLATFORM}/wrapper"
WRAPPER_CONF="${NEXUS_HOME}/conf/wrapper.conf"
PRIORITY=
PIDDIR="/var/run"
#RUN_AS_USER=nexus
这个脚本有一个适当的chkconfig指令,因此要添加Nexus为一个服务,你要做的是运行如下的命令:
$ cd /etc/init.d $ chkconfig --add nexus $ chkconfig --levels 345 nexus on $ service nexus start Starting Sonatype Nexus... $ tail -f /usr/local/nexus/logs/wrapper.log
第二个命令添加nexus为一个服务,可以由service命令启动和停止,可以由chkconfig命令管理。chkconfig管理/etc/rc[0-6].d中的符号链接,当操作系统重启或者在运行级别中转换时,它们控制服务的启动和停止。第三个命令添加nexus至运行级别3,4,和5
。service命令启动Nexus,最后的命令追踪wrapper.log以验证Nexus成功启动。如果Nexus成功启动了你应该看到一个信息告诉你Nexus正在端口8001监听HTTP连接。
升级一个已安装的Nexus版本十分容易。每个Nexus版本有两个可用的归档文件可下载。完整的归档文件包含Nexus应用程序,Nexus启动脚本,以及用来保存仓库索引和远程仓库本地缓存的工作目录。如果你大量的使用Nexus,这个工作目录会包含数G的构件,你不会希望在每次升级Nexus的时候必须重新创建这个仓库。升级下载文件被创建成为用户提供一个方便的形式升级Nexus,它会保存Nexus数据;升级下载文件只包含Nexus应用程序代码。第一次你安装Nexus的时候,你下载完全的Nexus分发包,当你想要升级你的Nexus安装,同时保留你的仓库数据的时候,你只要下载升级分发包。
要升级Nexus,只要下载“upgrade”分发包,而非“bundle”分发包。升级分发包的内容存储在一个包含nexus版本号(如nexus-1.0.0-beta-3)的文件夹中。这个文件夹可以解开至$NEXUS_HOME/runtime/apps,不用覆盖当前安装版本的内容。
$ cd $NEXUS_HOME/runtime/apps $ unzip nexus-1.0.0-beta-3-upgrade.zip
如果你下载了GZip归档的TAR文件,运行:
$ cd $NEXUS_HOME/runtime/apps $ tar xvzf nexus-1.0.0-beta-3-upgrade.tgz
当升级归档文件解压至$NEXUS_HOME/runtime/apps后,你必须从之前的Nexus版本复制配置文件至新安装的版本。从$NEXUS_HOME/runtime/apps/nexus/conf/nexus.xml复制nexus.xml至$NEXUS_HOME/runtime/apps/nexus-1.0.0-beta-3/conf。你应该也复制所有你自定义的日志配置文件log4j.properties和jul-logging.properties。在你从当前的Nexus版本复制了配置文件至新版本的Nexus后,停止Nexus服务器。
现在,你需要重命名$NEXUS_HOME/runtime/apps/nexus目录为一个反映它旧版本号的名称。比如,在这个例子中$NEXUS_HOME/runtime/apps/nexus将成为$NEXUS_HOME/runtime/apps/nexus-1.0.0-beta-3。然后,将你新版本改为$NEXUS_HOME/runtime/apps/nexus。在Unix系统上,你需要创建一个符号链接$NEXUS_HOME/runtime/apps/nexus指向$NEXUS_HOME/runtime/apps/nexus-1.0.0-beta-2。在Windows系统上,你可能需要复制$NEXUS_HOME/runtime/apps/nexus-1.0.0-beta-2至$NEXUS_HOME/runtime/apps/nexus。在你用新版本的Nexus交换了旧版本的Nexus后,你应该能使用启动脚本启动Nexus。Nexus启动之后,检查$NEXUS_HOME/logs/wrapper.log。Nexus初始化之后,它会打印出Nexus版本号。
Nexus为那些只需要搜索,浏览构件,以及查阅系统RSS源的用户提供了匿名访问。匿名访问级别更改了导航菜单,以及当你在一个仓库上右击时可用的选项。这种只读访问显示了如Figure 16.2, “匿名用户的Nexus界面”的用户界面。
Nexus最直接的用途之一就是浏览Maven仓库的结构。如果你点击Views菜单下的Browse Repositories菜单项。Figure 16.3, “浏览一个Nexus仓库”中的上面一半给你显示了带有仓库类型和仓库状态的组列表和仓库列表。
当你浏览一个仓库的时候,你可以在任意一个文件上右击然后直接下载到你本地。这能让你手工获取某个特定的构件,或者在浏览器中检查一个POM文件。
Nexus包含排序好的仓库组,它们能让你通过一个单独的URL来暴露一系列的仓库。通常情况下,一个组织会指向两个默认的Nexus组:Public Repositories组和Public Snapshot Repositories组。很多最终用户不需要知道哪些构件来自哪个特定的仓库,他们只需要能够浏览公共仓库组就可以了。为了支持这个用例,Maven允许你浏览一个Nexus组的内容,它就像是一归并而来的树状的仓库。Figure 16.4, “浏览一个Nexus组”显示了这个浏览界面,其中一个Nexus组被选中以浏览。对用户体验来说,浏览一个Nexus组和浏览一个Nexus仓库没任何区别。
在左边的导航区域,紧靠放大镜有一个构件搜索输入框。要通过groupId或者artifactId搜索一个构件,输入一些文本然后点击放大镜。输入字段"maven"然后点击放大镜会产生如Figure 16.5, “关键词为"maven"的构件搜索结果”的搜索结果。
在你找出你在要找的构件之后,你可以点击Download链接来下载这个构件。Nexus每次为你显示50条结果,并且为你浏览其它搜索结果在底部提供了链接。如果你更喜欢看到所有匹配构件的列表,你可以在搜索结果面板底部的下拉菜单中选择Fetch All。
除了通过一个groupId或者一个artifactId搜索,Nexus还有一个功能能让你通过校验和来搜索一个构件。
让我来猜一下?你安装了Nexus,使用了搜索框,输入了一个构件的group的名字,按下搜索,然后什么都没看见。没有结果。Nexus默认不会去获取远程仓库索引,你需要为那三个Nexus自带的仓库激活远程索引的下载。没有这些索引,没有没东西可以搜索。你可以在Section 16.2.4, “安装后检查单”中查找激活索引下载的指令。
Nexus提供了一些捕捉系统事件的RSS源,你可以通过点击View菜单下的System Feeds来浏览它们。如Figure 16.6, “浏览Nexus系统信息源”中的面板。你可以使用这些简单的界面来浏览最近Nexus中发生的关于构件部署,构件缓存,存储变化的报告。
如果你正在一个很大的组织工作,很多开发团队往同样一个Nexus实例部署构件,这些信息源就非常有用。有了这样的准备,所有组织开发人员可以为新部署的构件订阅RSS信息源,以确保当一个新的发布版提交到Nexus后所有的人都知道。将系统事件暴露成RSS信息源也将大门向其他人开启,包括一些对该信息更富创意的使用,如将Nexus与外部的自动测试系统想连。要访问某个特定信息源的RSS,在System Feeds观察面板中选择一个信息源然后点击Subscribe按钮。Nexus会在你浏览器中载入这个RSS信息源,然后你可以在你最喜欢的RSS阅读器中订阅这个信息源。
在系统信息源视图中有6个可用的信息源,每一个信息源都有一个类似于下面的URL:
http://localhost:8081/nexus/service/local/feeds/recentChanges
其中recentChanges将会被你试图阅读的信息源标识所替换。可能的系统信息源包括:
Table 16.1. 可用的系统信息源
| 信息源标识符 | 描述 |
|---|---|
brokenArtifacts |
校验和不匹配,找不到校验和,不可用的POM |
recentCacheOrDeployments |
所有仓库中有新的构件(从远程缓存的或者部署上去的) |
recentlyCached |
所有仓库中有新的缓存构件 |
recentlyDeployed |
所有仓库中有新的部署的构件 |
recentChanges |
所有缓存,部署,或者删除动作 |
systemRepositoryStatusChanges |
自动或者用户发起的变更(服务失效和阻塞的代理) |
systemChanges |
启动Nexus,更改配置,重新编制索引,以及属性重建 |
日志和配置文件只有在管理员用户的Views菜单中可见。点击该选项会看到如Figure 16.7, “浏览Nexus日志和配置文件”中的对话框。在这个屏幕你可以通过点击Download按钮旁边的下拉选择菜单来查看一下的日志和配置文件。
nexus.log把它想成是一个Nexus的总体的应用程序日志。除非你是管理员用户,否则你可能不会对这个日志的信息有什么兴趣。如果你正试图调试一个错误,或者你有Nexus中未发现的bug。你会使用这个日志查看器来诊断Nexus的问题。
nexus-rest-0.log核心的Nexus服务实际上是一堆REST服务,你正使用的UI只是和这些REST服务交互以配置和查看Nexus的组及仓库。这个日志文件反映了由Nexus UI和Nexus REST服务交互所生成的活动。
nexus.xml这个XML文件包含了大部分你所使用的Nexus实例的配置数据。它被存储在${NEXUS_HOME}/runtime/apps/nexus/conf/nexus.xml。
要使用Nexus,你需要配置Maven去检查Nexus而非公共的仓库。为此,你需要编辑在你的~/.m2/settings.xml文件中的mirror配置。首先,我们会演示如何配置Maven去检查你的Nexus安装而非直接从中央Maven仓库获取构件。在我们覆盖了中央仓库并演示了Nexus可以工作之后,我们会转回来,提供一个更实际的,包含发布版和快照版的配置集合。
要配置Maven去查阅Nexus而非中央Maven仓库,在你的~/.m2/settings.xml文件中添加如Example 16.1, “为Nexus配置Maven Settings (~/.m2/settings.xml)”的mirror配置。
Example 16.1. 为Nexus配置Maven Settings (~/.m2/settings.xml)
<?xml version="1.0"?>
<settings>
...
<mirrors>
<mirror>
<id>Nexus</id>
<name>Nexus Public Mirror</name>
<url>http://localhost:8081/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
在你将Nexus配置成所有仓库的镜像之后,Maven现在会从本地的Nexus安装查阅,而非去外面查阅中央Maven仓库。如果对Nexus有一个构件请求,本地的Nexus安装会提供这个构件。如果Nexus没有这个构件,Nexus会从远程仓库获取这个构件,然后添加至远程仓库的本地镜像。
要测试Nexus如何工作的,从你的本地Maven仓库中删除一个目录,然后运行Maven构建。如果你删除了~/.m2/repository/org,你会删除一大堆的依赖(包括Maven
插件)。下次你运行Maven的时候,你应该看到如下的信息:
$ mvn clean install
...
Downloading: http://localhost:8081/nexus/content/groups/public/...
3K downloaded
这个输出应该能让你相信Maven正和你本地的Nexus通讯,而非向外面的中央Maven仓库获取构件。在你基于本地的Nexus运行过一些构建之后,你就可以浏览缓存在你本地Nexus中的内容。登陆Nexus然后点击导航菜单的左边的构件搜索。在搜索框中输入"maven",你应该能看到一些像下面的内容。
Section 16.4.1, “使用Nexus中央代理仓库”中的Maven配置能让你使用Nexus公共组,这个组从4个由Nexus管理的仓库解析构件,但是它不让你查阅public-snapshots组,该组包括了Apache和Codehaus的快照版。要配置Maven让它为发布版和插件都使用Nexus,你必须配置Maven,通过往你的Maven文件~/.m2/settings.xml中添加如下的镜像配置,使其查阅Nexus的组。
Example 16.2. 配置Maven使其为发布版和快照版使用Nexus
<settings>
<mirrors>
<mirror>
<!--This is used to direct the public snapshots repo in the
profile below over to a different nexus group -->
<id>nexus-public-snapshots</id>
<mirrorOf>public-snapshots</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public-snapshots</url>
</mirror>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>development</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<!--this profile will allow snapshots to be searched when activated-->
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>development</activeProfile>
</activeProfiles>
</settings>在Example 16.2, “配置Maven使其为发布版和快照版使用Nexus”中我们定义了两个profile:development和public-snapshots。development
profile被配置成从central仓库下载构件,通过一个假的URL
http://central。public-snapshots被配置成从public-snapshot仓库下载构件,通过一个假的URL
http://public-snapshots。这些假的URL被同一settings.xml文件中的两个mirror配置重写。第一个镜像被配置成覆盖public-snapshots仓库,而使用public-snapshots
Nexus组。第二个镜像覆盖所有其它的仓库,而使用public
Nexus组。有了这些配置,所有的构建都会包含public
Nexus组,如果你想包含public-snapshots组,你必须添加public-snapshots这个Profile,通过在命令行使用如下的
-P 标志。
$ mvn -Ppublic-snapshots clean install
如果你已经将你的Maven
settings.xml配置成使用Nexus作为所有公共仓库和所有公共快照仓库的镜像,你可能会遇到一些项目不能够从你的本地Nexus获取需要的构件。这很常见,因为你经常会构建一些在pom.xml中自定义一组repositories和snapshotRepositories的项目。如果你正在构建开源项目,或者往你的配置中添加了自定义的第三方Maven仓库,那么这种情况就会发生。
作为一个例子,让我们试试从我们签出的源代码构件Apache Shindig。什么是Apache Shindig?对该例来说这不重要;我们需要的是一个能很容易签出和构建的样例项目。如果你实在很想知道,Shindig是在Apache Incubator中的一个围绕Google的OpenSocial API的项目。Shindig目标是提供一个允许人们运行OpenSocial小工具的容器。它给我们提供了一个有趣的样例工程,因为它有一些没有被加入到中央Maven仓库的组件,于是依赖于一些自定义的Maven仓库,使用Shindig我们可以向你展示当Nexus没有你要的构件的时候会发生什么,以及你能够使用怎样的步骤来给Nexus添加仓库。
下面的样例假设你已经安装了Subversion,并且你正在命令行运行Subversion。我们使用Subversion从Apache Incubator签出Apache Shindig然后尝试构建它。为此,执行下面的命令:
$ svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk shindig ... Subversion will checkout the trunk of Apache Shindig ... $ cd shindig $ mvn install ... Maven will build Shindig ... Downloading: http://localhost:8081/nexus/content/groups/public/caja/caja/r820/caja-r820.pom Downloading: http://localhost:8081/nexus/content/groups/public/caja/caja/r820/caja-r820.jar [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Failed to resolve artifact. Missing: ---------- 1) caja:caja:jar:r820 Try downloading the file manually from the project website. ... ---------- 1 required artifact is missing. for artifact: org.apache.shindig:gadgets:war:1-SNAPSHOT from the specified remote repositories: oauth (http://oauth.googlecode.com/svn/code/maven), central (http://central), apache.snapshots (http://people.apache.org/repo/m2-snapshot-repository), caja (http://google-caja.googlecode.com/svn/maven)
这个构建失败了因为它下载不到一个构件。这个构件有一个group标识符为caja,artifactId是caja,版本是r820。这是一个存在于自定义仓库http://google-caja.googlecode.com/svn/maven中的一个构件。Maven没能够下载到这个构件是因为你的settings.xml被配置成指引所有的镜像至位于我们Nexus安装的public和public-snapshots组。即使Apache
Shindig的pom.xml定义了一个仓库并且将其指向了http://google-caja.googlecode.com/svn/maven,Nexus不会从一个它不知道的仓库中去获取构件。事实上,关于这次构建有两个仓库Nexus不知道:caja和oauth。Caja和OAuth是两个仍然处于开发中的类库。两个项目都被“发布”了,而且Shindig所依赖的版本当然不是快照版,但是这些项目没有被发布到中央Maven仓库。在我们能构建这个项目之前,我们需要想办法让Nexus知道这些仓库。
有两种方法可以解决这个问题。首先,你可以更改你的以settings.xml覆盖特定的仓库定义符。你可以更改settings.xml中的mirrorOf元素为"central",而非让Nexus
public组
mirrorOf所有的仓库。如果你这么做了,Maven就会试图直接从oauth和caja仓库下载依赖。这行得通,因为Maven只会为那些匹配settings.xml中mirrorOf元素的仓库去查阅Nexus。如果Maven看到一个仓库定义符caja或者oauth,而且没有在你的settings.xml中看到一个镜像,它会直接去连接这个仓库。
第二种方法,更有趣的选择是添加这些仓库至Nexus,并且添加这些仓库至public组。
要添加caja仓库,以管理员登陆Nexus,在左边导航菜单Configuration部分中点击Repositories链接。点击这个链接后会看到一个窗口列出了所有Nexus所知道的仓库。之后你想要创建一个新的代理仓库。为此,点击在仓库列表正上方的Add链接。点击单词Add右边的朝下的箭头,会看到一个下拉菜单,带有选项:Hosted,Proxy,和Vitual。既然你要创建一个代理仓库,点击Proxy。之后,你会看到一个如Figure 16.9, “添加一个Nexus仓库”的页面。填充那些必填字段,Repository ID为"caja",Repository Name为"Google Caja"。设置Repository Policy为"Release",以及Remote Storage Location为http://google-caja.googlecode.com/svn/maven。
在你填写完这个页面之后,点击Save按钮。Nexus就会接受这个caja代理仓库的配置。为oauth仓库重复同样的工作。创建一个仓库,Repository ID为oauth,选择Release policy,Remote Storage Location为http://oauth.googlecode.com/svn/code/maven。
下一步你需要做的是添加这些新的仓库至public Nexus组。为此,点击左边导航菜单中Configuration部分的Groups链接。当你看到组管理页面后,点击public repositories 组,你应该能看到如Figure 16.10, “添加新的仓库至一个Nexus组”的页面。
Nexus使用了一个十分有趣的,名为ExtJS的Javascript小工具类库。ExtJS提供了许多有趣的UI小工具,能为用户提供丰富的交互体验。要添加这两个新的仓库至public
Nexus组,在可用仓库列表中找到仓库,点击你想要添加的仓库然后拖拉进Ordered Group
Repositories。一旦仓库在Ordered Group
Repositories列表中,你可以点击并拖拉列表中的仓库,以改变为匹配构件进行搜索的仓库的顺序。在Google Caja和Google
OAuth项目仓库被添加到public Nexus组之后,你应该能够构建Apache
Shindig并观察到Maven从各自的仓库下载Caja和OAuth。
本节展示的很多配置页面只对管理员可用。Nexus允许管理员用户自定义仓库列表,创建仓库组,自定义服务器设置,以及创建Maven用来包含或排除某个仓库构件的路线或者“规则”。
在一个实际的Nexus安装中,你可能会想要自定义管理员密码,而非使用“admin123”,你可能会想要复写Nexus用来存储仓库数据的默认目录。为此,以管理员用户登陆然后点击左边导航菜单Administration下面的Server。服务器配置界面如Figure 16.11, “Nexus服务器配置”显示。
该页面能让你更改:
默认的管理员密码是admin123。如果你填写这个字段并点击了Save按钮,你及更改了这个Nexus安装的管理员密码。
在File Settings组下面,你可以自定义工作目录。如果你的Nexus安装将要作为很大的仓库的镜像,而且你想要将你的工作目录放到另外一个硬盘分区,你可能会想要自定义工作目录。
你可以改变Nexus寻找日志的位置。在一个Unix机器上,一个通常的实践是将日志文件放到/var/log。如果你遵