Maven学习笔记(八):使用Nexus创建私服

通过建立自己的私服,就可以降低中央仓库负荷、节省外网宽带、加速Maven构建、自己部署构件等,从而有效地使用Maven。Nexus是当前最流行的Maven仓库管理软件。

Nexus简介:

Nexus分为开源版和专业版,其中开源版本基于GPLv3许可证,其特性足以满足大部分Maven用户的需求。以下是一些Nexus开源版本的特性:

  • 较小的内存占用(最少仅为28M)
  • 基于ExtJS的友好界面
  • 基于Restlet的完全REST API
  • 支持代理仓库、宿主仓库和仓库组
  • 基于文件系统,不需要数据库
  • 支持仓库索引和搜索
  • 支持从界面上传Maven构件
  • 细粒度的安全控制

Nexus专业版是需要付费购买的,除了开源版本的所有特性之外,它主要包含一些企业安全控制、发布流程控制等需要的特性。

安装Nexus:

Nexus是典型的Java web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。

下载Nexus:

http://www.sonatype.org/下载最新的nexus,当前可以下载最新的Bundle包是nexus-2.9.1-02-bundle.tar.gz或者nexus-2.9.1-02-bundle.zip,也可以下载war包nexus-2.9.1-02.war。

Bundle方式安装Nexus:

Nexus的Bundle自带了Jetty容器,因此用户不需要额外的Web容器就能直接启动Nexus。首先将Bundle文件解压,这时就会得到如下两个子目录:

  • nexus-2.9.1-02/:该目录包含了Nexus运行所需要的文件,如启动脚本、依赖jar包等。
  • sonatype-work/:该目录包含Nexus生成的配置文件、日志文件、仓库文件等

其中,第一个目录是运行Nexus所必需的,而且所有相同版本Nexus实例所包含的该目录内容都是一样的。而第二个目录不是必需的,nexus会将不同用户在不同机器上使用的Nexus的不同配置和仓库内容放在其中。当用户需要备份Nexus的时候,默认备份sonatype-work/目录,因为该目录包含了用户特定的内容。

在Windows操作系统上,用户需进入nexus-2.9.1-02/bin/jsw/windows-x86-32/子项目,然后直接运行console-nexus.bat脚本就能启动Nexus。

这时,打开浏览器访问http://localhost:8081/nexus/就能看到Nexus的界面。

要停止Nexus,可以在命令行按Ctrl+C键。

在nexus-2.9.1-02/bin/jsw/windows-x86-32/目录下还有其他一些脚本:

  • install-nexus.bat:将Nexus安装成Windows服务
  • uninstall-nexus.bat:卸载Neuxs Windows服务
  • start-nexus:启动Neuxs Windows服务
  • stop-nexus:停止Neuxs Windows服务

借助Windows服务,用户就可以让Nexus伴随着Windows自动启动,非常方便。

关于Bundle安装的一个常见问题是端口冲突。Nexus Bundle默认使用的端口是8081,如果该端口已经被其他应用程序占用,或者你想使用80端口开发Nexus服务,则编辑文件nexus-2.9.1-02/conf/plexus.properties,找到属性application-port,按需要将默认值8081改成其他端口号,然后保存该文件,重启Nexus便可。

WAR方式安装Nexus:

Nexus还提供一个可以直接部署到Web容器中的war包。该包支持主流的Web容器,如Tomcat、Glassfish、Jetty和Resin。

以tomcat为例,把war包放在tomcat的webapps目录下,然后启动tomcat。

然后访问http://localhost:8080/nexus/就能看到Nexus的界面了。

登陆Nexus:

Nexus的权限控制很完善,默认的Nexus访问都是匿名的,而匿名用户仅包含一些最基本的权限,要获得更高的权限,就必须以管理员方式登录。单击界面右上角的Log In进行登陆,Nexus的默认管理员用户名和密码为admin/admin123。

Nexus的仓库与仓库组:

Nexus包含了各种类型的仓库概念,包括代理仓库、宿主仓库和仓库组等。每一种仓库都提供了丰富实用的配置参数,方便用户根据需要进行定制。

Nexus内置的仓库:

单击Nexus界面左边导航栏中的Repository链接,就能在界面右边看到当前nexus所包含的所有仓库。

从中可以看到仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟)。此外仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。最后两列的值为仓库的状态和路径。

下面解释一下各个仓库的用途:

  • Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
  • Releases:这是一个策略为Releases的宿主类型仓库,用来部署组织内部的发布版本构件。
  • Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
  • 3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。
  • Apache Snapshots:这个一个策略为Snapshots的代理仓库,用来代理Apache Maven仓库的快照版本构件。
  • Codehaus SnapShots:这是一个策略为Snapshots的代理仓库,用来代理Cohehaus Maven仓库的快照版本构件。
  • Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。
  • java. net -Maven 2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件。
  • Public Repository:该仓库组将上诉所有策略为Release的仓库聚合并通过一致的地址提供服务。
  • Public Snapshot Repositories:该仓库组将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。

Nexus仓库的分类的概念:

示意图如下:

从图中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容,它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。

Nexus的索引与构件搜索:

对于Nexus我们常用的功能是搜索一个构件。Nexus通过维护一个索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标。

为了能够搜索Maven中央库,首先需要设置Nexus中Maven Central代理仓库下载远程索引。需要注意的是,默认这个配置的值是关闭的。

有了索引,用户就可以搜索Maven构件了。Nexus左边导航栏有一个快捷搜索框,输入关键字就可以进行搜索了。

在搜索的结果中单击某一项,会在界面的下端浮出一个更具体的构件信息面板。

该面板中除了显示构件的坐标,还包含了一段XML依赖声明,用户可以直接复制粘贴到项目的POM中。除了简单的关键字搜索,在Nexus中还提供了GAV搜索、类名搜索和检验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:

  • GAV搜索(GAV Search) :允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索。
  • 类名搜索(Classname Search) :允许用户搜索包含某个Java类的构件。
  • 校验和搜索(checksum Search):允许用户直接使用构件的检验和来搜索该构件

配置Maven从Nexus下载构件:

在POM中可以设置项目从私服中下载构件,但是实际应用中,我们通常想要所有项目都从私服中下载构件,这时就需要我们在setting.xml文件配置。setting.xml并不支持直接配置repositories和pluginRepositories,但是Maven能使用Profile机制,能让用户将仓库配置放到setting.xml的profile中。在实际应用中,我们希望的是所有下载请求都通过私服,所以我们还需要用到镜像的配置。

配置范例如下:

<settings>
     ...
     <mirrors>
          <mirror>
               <id>nexus</id>
               <mirrorOf>*</mirrorOf>
               <url>http://localhost:8081/nexus/content/groups/public</url>
          </mirror>
     </mirrors>
     <profiles>
          <profile>
               <id>nexus</id>
               <repositories>
                    <repository>
                         <id>central</id>
                         <url>http://central</url>
                         <release><enabled>true</enabled></release>
                         <snapshots><enabled>true</enabled></snapshots>
                    </repository>
               </repositories>
                <pluginRepositories>
                    <repository>
                         <id>central</id>
                         <url>http://central</url>
                         <release><enabled>true</enabled></release>
                         <snapshots><enabled>true</enabled></snapshots>
                    </repository>
               </pluginRepositories>
          </profile>
     </profiles>
     <activeProfiles>
          <activeProfile>nexus</activeProfile>
     </activeProfiles>
     ...
</settings>

这里的仓库及插件仓库配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要,因为所有请求都会通过镜像访问私服地址。配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,它首先检查central,看该类型的构件是否支持,得到正面的回答之后,再根据镜像匹配规则转而访问私服仓库地址。

部署构件至Nexus:

我们经常将组织内部的,或者一些无法从公共仓库中获得的第三方构件上传到宿主仓库中,供大家使用。用户可以配置Maven自动部署构件至Nexus的宿主仓库,也可以通过界面上传构件。

使用Maven部署构件至Nexus:

日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。下面展示一段典型的配置:

<project>
     ...
     <distributionManagement>
          <repository>
               <id>nexus-release</id>
               <name>Nexus Release Repository</name>
               <url>http://localhost:8081/nexus/content/repositories/</url>
          </repository>
          <snapshotRepository>
               <id>nexus-snapshots</id>
               <name>Nexus Snapshots Repository</name>
               <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
          <snapshotRepository>
     </distributionManagement>
     ...
</project>

Nexus的仓库对于匿名用户是只读的。为了能够部署构件,需要在settings.xml中配置认证信息,如下:

<settings>
     ...
     <servers>
          <server>
               <id>nexus-release</id>
               <username>admin</username>
               <password>*****</password>
          </server>
               <id>nexus-snapshots</id>
               <username>admin</username>
               <password>*****</password>
     </servers>
     ...
</settings>

手动部署:

有时,我们需要将手动部署构件到仓库中。

要上传第三方构件,首先选择一个宿主仓库,然后在页面的下方选择Artifact Upload选项卡。在上传构件的时候,Nexus要求用户确认其Maven坐标,如果该构件是通过Maven构建的,那么可以在GAV Definition下拉列表中选择From POM,否则选择GAV Parameters,用户需要为该构件定义一个Maven坐标。

时间: 2024-08-29 11:21:33

Maven学习笔记(八):使用Nexus创建私服的相关文章

项目构建之maven篇:5.仓库及nexus创建私服-1

依赖坐标与本地仓库存储 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.7.RELEASE</version> </dependency> 本地仓库存储 仓库分类: 本地仓库: <localRepository>F:\maven\repos<

项目构建之maven篇:5.仓库及nexus创建私服-2

下载安装 下载地址 修改默认端口: home\conf\nexus.properties # Sonatype Nexus # ============== # This is the most basic configuration of Nexus. # Jetty section application-port=9080 application-host=0.0.0.0 nexus-webapp=${bundleBasedir}/nexus nexus-webapp-context-pa

Maven学习笔记-使用Eclipse插件创建Java Webapp项目

使用Java的猿们,最多接触的大概就是web项目了吧?在学习Maven的过程中,首先当然就是创建一个webapp项目. 自己在尝试的过程中,碰到了很多的问题.我把详细的过程都记录下来,用以今后参考. 步骤: 如果未搭建好Maven开发环境,请参考前一篇:Maven学习笔记--环境搭建 打开Eclipse, 菜单栏选择File -> new -> other,在弹出的对话框中找到Maven Project. 在弹出的新建Maven项目的对话框中,不要勾选第一项"Create a sim

Maven学习笔记之——仓库(中)

Maven学习笔记之--仓库(中) 1.    远程仓库的配置 当出现默认的中央仓库无法满足我们的需求或者连接不上的时候.我们可以通过POM文件来指定远程仓库. <repositories> <repository> <id>jboss-maven2-release-repository</id> <name>JBoss Repository</name> <url>http://repository.jboss.org/

Maven学习笔记之——仓库(上)

Maven学习笔记之--仓库(上) 1.    何为maven仓库 Maven可以在某一指定位置统一存放所有maven项目共享的构件.此指定位置就是maven仓库.实际的项目将不再自己存放其所依赖的构件.他们只需要声明这些依赖的坐标.在需要的时候就会自动根据坐标找到仓库中的构件.并使用他们. 仓库的意义:减少磁盘占用空间.去除大量重复的构件.尤其是项目越来越多.越来越大的时候.更便于统一管理所有控件. 2.    仓库的布局 任何一个构件都有其唯一的坐标.根据这个坐标可以定义其在仓库中的唯一存储

Maven学习笔记之——坐标和依赖(中)

Maven学习笔记之--坐标和依赖(中) 1.    传递性依赖 1.1    何为传递性依赖 项目中经常有引入一个jar包还要引入其他与其相关的jar包.自己搜的话要注意很多.比如版本问题等.而Maven会解析解析各个直接依赖的POM.将哪些必要的间接依赖以传递依赖的形式引入到项目中. 依赖范围不仅可以控制依赖与三种classpath关系.还对传递依赖产生影响. 假设A依赖B,B依赖C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖.第一直接依赖的范围和第二直接依赖

Lua学习笔记(八):数据结构

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在Lua中table很好的实现了这些数据结构. 1.数组 在Lua中通过整数下标访问table中元素,既是数组,并且数组大小不固定,可动态增长.通常我们初始化数组时,就间接地定义了数组的大小,例如: 1 a = {} -- new array 2 for i=1, 1000 do 3 a[i] = 0 4 end 5 6 --数

《Hibernate学习笔记八》:组件映射

<Hibernate学习笔记八>:组件映射 前面介绍了一对一的单向.双向外键关联,例如,学生证和学生是一个一对一的关系.这篇博文主要是介绍下组件映射,即一个是另一个的一部分,例如,学生证的信息也可以作为学生信息的一部分,即在数据库中只存在学生一个表,而不是有学生和学生证两个表,并且这两个表中有一个一对一的关联关系. 如下: 有人或许会说,那我们就将学生和学生证的信息写在一个类中,则就不需要组件映射了,确实可以这样,但是,根据类的设计原则,我们一般都会将其设计为两个类,然后将学生证的信息作为一个

Maven学习笔记(二):Maven仓库

Maven仓库的知识点比较少,理解起来也很简单. 仓库只有两类:本地仓库和远程仓库.所谓本地仓库就是自己机器上的仓库,在setting.xml文件中进行配置: 1 <localRepository>E:/MavenStore</localRepository> 本地仓库中存储的就是在使用Maven解析项目时从远程仓库下载的依赖和自己安装的一些构建. 远程仓库很明显就是网络上的仓库,存储在一个神秘的地方(好吧,其实我是不知道在哪里).当Maven解析项目时,如果本地没有需要的依赖,就