Nexus 私有仓库搭建与 Maven 集成

Nexus 私有仓库搭建与 Maven 集成

  Maven 是日常开发过程中,都会接触到的项目管理工具。Maven 可以将开发人员从繁杂的文档管理、项目打包等工作中解放出来,把更多的精力放在业务开发上。Maven 带来的便利这里就不多说了,但是只是单单使用 Maven,有时候也会遇到依赖文件无法下载的情况,原因有很多,有可能是*仓库的问题,也有可能是网络问题等等;与此同时,有一部分的第三方的类库是没有发布到 Maven 上的,因此并没有 Maven 相关的依赖信息,这就给我们使用 Maven 构建项目带来了一定的麻烦。例如以下的这个例子,就是经常会遇到的问题。

  在最近的一个测试项目中,由于个人比较喜欢有条不紊,所以一直是使用 Maven 作为项目构建的工具,但是在构建 Hibernate 相关依赖的过程中,发现有一部分相关的 Jar 无法正常下载,中间也换过各种软件仓库,但是最后都是无法正常构建项目。

1

2

3

4

5

6

<dependency>

  <groupId>org.hibernate</groupId>

  <artifactId>hibernate-distribution</artifactId>

  <version>3.6.0.Beta2</version>

  <type>pom</type>

</dependency>

  Nexus 私有仓库搭建与 Maven 集成

  最后,实在没辙了,想起了要搭建一个私有仓库。本文主要介绍 Nexus 私有仓库的搭建过程,以及 Nexus 与 Maven 的整合。本文使用的 Nexus 版本为 Nexus Repository Manager OSS 2.14.5-02 ,之所以不使用最新的 Nexus Repository Manager OSS 3 是因为个人感觉版本3还没有版本2友好,特别是在图形管理界面的操作上。

  首先需要到官网上下载 Nexus Repository Manager OSS 2.14.5-02 的安装包,下载地址为:https://www.sonatype.com/download-oss-sonatype,解压后的目录结构:

   Nexus 私有仓库搭建与 Maven 集成

  在命令行窗口,进入 \nexus-2.14.5-02-bundle\nexus-2.14.5-02\bin 目录,输入 nexus install 命令,安装 Nexus(需要等待一小段时间)。安装成功后,进入服务管理界面,找到一个名为 nexus 的服务,启动该服务,服务启动完成后,打开浏览器,输入 http://localhost:8081/nexus ,如果可以看到欢迎界面,说明 Nexus 安装成功了。

   Nexus 私有仓库搭建与 Maven 集成

  点击右上角的登录按钮,输入管理员账号和密码(默认账号:admin,密码:admin123)登录。

Nexus 私有仓库搭建与 Maven 集成

  登录成功后,选择左边 Views/Repositories 菜单下的 Repositories,可以看到一些预设的仓库,我们会用到的一般只有 Public Repositories 和 3rd party , Public Repositories 为公共仓库,3rd party 为第三方仓库,可以上传第三方的 Jar (当然也可以是自己封装的 Jar)。

Nexus 私有仓库搭建与 Maven 集成

  Nexus 安装成功后,接下来需要修改 Maven 的配置文件(settings.xml),整合 Nexus。

  找到 <servers> 标签,添加 Nexus 默认认证信息:

1

2

3

4

5

6

7

8

9

10

<server>   

    <id>my-nexus-releases</id>   

    <username>admin</username>   

    <password>admin123</password>   

  </server>   

  <server>   

    <id>my-nexus-snapshot</id>   

    <username>admin</username>   

    <password>admin123</password>   

  </server>

  找到 <mirrors> 标签,添加镜像:

1

2

3

4

5

6

<mirror>

  <!--This sends everything else to /public -->

  <id>nexus</id>

  <mirrorOf>*</mirrorOf>

  <url>http://localhost:8081/nexus/content/groups/public/</url>

</mirror>

  找到 <profiles> 标签,添加仓库信息:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<profile>

  <id>nexus</id>

  <!--Enable snapshots for the built in central repo to direct -->

  <!--all requests to nexus via the mirror -->

  <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>

  **仓库:

1

2

3

4

<activeProfiles>

  <!--make the profile active all the time -->

  <activeProfile>nexus</activeProfile>

</activeProfiles>

  配置完成后保存,并重启 nexus  服务。

  重启  nexus  服务 完成后,在命令行窗口进入一个使用 Maven 构建的项目,输入 mvn package clean 命令,清理完成后,登录 nexus 的 admin 账号可以看到 Public Repositories  下出现了一些 Jar 包。

Nexus 私有仓库搭建与 Maven 集成

  此时刷新之前报错的项目,发现 Maven 依赖仍然有问题,无法正常下载 jboss 的一个 Jar 包。这个时候我们可以利用我们刚刚搭建的 Nexus 私有仓库,在网上自己下载缺失的 Jar 包,然后以第三方 Jar 的形式上传到私有仓库,依赖信息可以设置跟*仓库一样。例如添加 jbosscache-core-3.2.1.GA.jar ,在外网上的依赖为:

1

2

3

4

5

<dependency>

    <groupId>org.jboss.cache</groupId>

    <artifactId>jbosscache-core</artifactId>

    <version>3.2.1.GA</version>

</dependency>

  选择 3rd party,把我们自己下载的  jbosscache-core-3.2.1.GA.jar 上传到 3rd party。在 Artifact Upload 选择卡页面,点击 Select Artifact(s) to Upload 按钮,选择需要上传的 Jar 包,选择完成后点击 Add Artifact 按钮。然后设置 Jar 的 Maven 依赖信息(后续引用 Jar 包需要用到),其中 Maven 依赖的相关信息可以设置成和*仓库一致,如下图:

Nexus 私有仓库搭建与 Maven 集成

Nexus 私有仓库搭建与 Maven 集成

Nexus 私有仓库搭建与 Maven 集成

Nexus 私有仓库搭建与 Maven 集成

  Jar 包上传成功后,切换到 Browse Index 选项卡页面,点击刷新按钮,可以看到我们刚刚上传的 Jar 包,选中 Jar 包我们可以在右边看到 Jar 包对应的 Maven 依赖信息,可以用于项目的构建。

Nexus 私有仓库搭建与 Maven 集成

  进入本地仓库删除 \.m2\org\jboss\cache\jbosscache-core\3.2.1.GA 目录下的所有文件(重要,否则会构建失败),此时,再次回到刚刚构建失败的项目,刷新 Maven,可以看到项目已经可以正常构建了。

Nexus 私有仓库搭建与 Maven 集成

  如果本地安装了 Maven,可以在 Maven 的安装目录找到一些常用的软件仓库,位置为:${MAVEN_HOME}\lib\maven-model-builder-3.3.3.jar 下 \org\apache\maven\model\pom-4.0.0.xml ,其中 ${MAVEN_HOME} 为 Maven 的安装目录,用编辑器打开 pom-4.0.0.xml 可以看到很多预设的软件仓库。

  此处,也提供一些常用的软件仓库:

  http://maven.aliyun.com/nexus/content/groups/public(阿里云,推荐)

  http://mvnrepository.com

  http://www.sonatype.org/nexus

  http://repo1.maven.org/maven2

  这里,也提供一些 Maven 的参考资料:

  http://www.codeweblog.com/category/maven-gradle/

 

|出处:http://www.cnblogs.com/rexfang/

 

nexus的作用
在maven中有一个很重要的概念:仓库。在开发时有本地仓库,然后有maven的*仓库。但对于一个企业或部门而言,却没有一个属于自己的仓库,一个企业也有自己封装的jar包和插件,本地仓库仅限每个开发者使用,*仓库包罗万象供全球使用,但是没有为为企业提供管理自己产品的地方。引入nexus,就是为了搭建企业级的私有仓库,管理企业级依赖。下图是maven中nexus的作用图示:

nexus除了上面的作用外,还有很多好处,如节省贷款,控制和审计、部署第三方控件等,为maven的管理提供了很大的便利。

为maven提供搭建企业级私服的工具还有一些,但是常用的是sonatype公司的nexus软件。其包含jetty容器,可以自发布,实现仓库和权限管理。

nexus搭建步骤
1.       下载nexus,地址:http://www.sonatype.org/nexus/go/

2. 将下载文件拷贝到一个指定的文件夹,如:D:\maven_home\co_repository,然后解压缩,得到文件夹结构:


说明:nexus-2.11.0-02包含nexus程序,sonatype-work是nexus仓库保存jar包的默认路径。

3.设置环境变量,添加nexus的工作路径,在系统变量path前添加这段话:D:\maven_home\co_repository\nexus-2.11.0-02\bin;(windows)

注意:nexus oos版本,推荐安装的操作系统时linux,如果是unix,nexus官方文档说是可以支持。但是我用hp-ux的操作系统时,却不支持。因为%NEXUS_HOME%/bin/jsw/目录下,并没有对应hp-ux的平台启动程序。官方的说法也是推荐安装在linux上,unix下的安装未经过深度测试。

linux下可以不修改环境变量,直接在%NEXUS_HOME%/bin/目录下,执行命令:./nexus start 或./nexus stop命令,即可启动或停止程序。

4. 进入cmd命令,输入命令:nexus,可以看到如下界面:

5.命令的意思很清楚。现在开始启动,首次启动前先要执行:nexus install,将nexus服务添加到本地服务中:

然后再执行:nexusstart


6.Nexus启动后,访问网址(这里安装在本地):http://localhost:8081:nexus。得到界面:

到此,nexus安装完成。

nexus配置
使用默认仓库配置
1.登陆。点击右上角的:Log In。输入用户名密码:admin/admin123(默认)。登陆后,点击右侧的菜单栏:views/repository->Repositories,得到界面:

关于上面这个界面,先做点笔记:

上图红框中有很多仓库(repository),仓库中对应保存来自不同地方的依赖和插件。这些仓库有很多类型(type),大概有四个类型:

1)proxy,来自开源网站的一些依赖,如apache、*仓库(central)、codehaus;

2)virtual,主要用于maven1,很少用到;

3)hosted,顾名思义,这是针对我们开发者的,我们的可以上传自己的第三方包到3rd party,上传开发或发布的包到snapshots或releases;

4)group,可配置以上三种类型的repository到一个组,配置此组就可以有组中仓库的访问权限。

2.  让本地项目到nexus仓库下载jar依赖,配置项目中的pom.xml文件。比如我这里有一个maven项目maven_part4,配置pom.xml添加以下一段代码:

<repositories>
      <repository>
          <id>nexus</id>
          <name>Nexus Repositories</name>
          <url>http://localhost:8081/nexus/content/groups/public/</url>
      </repository>
</repositories>
注意:配置中的ID,name无限制,可以自定义。但url标签需要指定仓库的访问url。

说明:group类型的Repository是可配置的,在红框三中配置。将右侧的选项,添加到左侧,保存。所添加的仓库,在此组中就可以被访问。

3.上面步骤中,为了将远程仓库路径指向nexus的仓库路径,修改的是maven项目的pom.xml。那么,如果我们在新增项目,还是需要修改每个项目的pom.xml。为排除上面的不便,我们可以修改本地maven的配置:${user_home}/.m2/settings.xml,新增下面两段话:

3.1)在<profiles>标签中增加一个profile配置,如下:
<profile>
      <id>nexusProfile</id>
      <repositories>
        <repository>
            <id>public</id>
            <name>Public Repositories</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
        </repository>
        <!-- open this,can download releases version dependency-->
        <releases>
            <enabled>true</enabled>
        </releases>
        <!-- open this,can download snapshot version dependency,default is false. -->
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
      </repositories>
</profile>
3.2)在<activeProfiles>标签中,**上面的profile配置,如下:
<activeProfiles>
    <activeProfile>nexusProfile</activeProfile>
</activeProfiles>
这样,所有本地使用此maven的项目都会指向nexus仓库了。

(问题:

我配置完此项后,settings.xml并未生效。

后来是因为myeclipse中的配置未更新。Myeclipse中有两处settings.xml需要修改:一、maven路径下的setting.xml,本地所有maven都会采用此配置;二、用户路径下的settings.xml,路径${user_home}/.m2/settings.xml,修改过此配置文件,如果配置未生效,最好在myeclipse中找到此项,确认路径正确,并点击update settings,刷新配置。(就是因为这个原因,我修改过的settings迟迟不生效))

Maven继承理解:maven项目都有一个super POM,这是所有POM的父类,包含很多默认配置;然后是%M2_HOME%/conf/settings.xml,此配置的之也会融入POM,此配置针对maven程序;其次是${user_home}/.m2/settings.xml,此配置针对用户,其配置项会覆盖maven级的settings.xml,再融入POM;最后是项目的POM,针对项目的特殊性做配置。上面的四个文件共同对一个项目生效。

Profile配置理解:在一个maven项目中,可能在不同的情况下需要的运行环境有所不同。如,在开发时下我们用一套环境,在发布时我们用另一套环境;或者系统为了兼容多版本的jdk,需要做一些调整,也就需要对不同的jdk做不同的配置等。

一个profile配置,就是一个环境的特定设置,可以对同一个环境配置多个profile。

配置了profile不代表此配置就生效,profile生效有两种方式:一、用特定环境的信息触发此配置生效,用<activation>标签;二、profile可以不包含<activation> 标签,但是需要在<activeProfiles>标签中,引用profile的id,来定义指明你需要让哪些profile生效。

4.mirror的使用。
如果我们需要一个公司只管理一个自己的私有仓库,不能让开发者直接从*仓库下载依赖,那我们需要为*仓库设置一个镜像,将*仓库的链接指向nexus的仓库链接。镜像配置在${user_home}/.m2/settings.xml中。在<mirrors>标签中增加如下配置:

<mirror>
      <id>nexusMirror</id>
      <mirrorOf>*</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
注意:这里的mirrorOf配置的是repository的ID,代表匹配ID的工厂都访问此镜像;若配置多个repositoryID,可用英文逗号分隔;若配置*号,代表maven用户中所有工厂都访问此镜像。

其次,mirror只是映射符合条件(mirrorOf指定)的仓库的URL,而与匹配仓库的其他参数无关,若要修改,需要在对应的仓库位置修改。

*工厂配置在super POM中,工厂id为central,若只是想明确的设定某几个工厂的镜像,可以这样写,如:<mirrorOf>nexus,central</mirrorOf>

 设置管理自己仓库组
5.在nexus中,有现成的Releases和Snapshots仓库。但是一个公司中,可能有几个不同的研发部门或不同的研发组,他们需要管理自己各自的开发和发布版本。Nexus为我们提供了创建自己的仓库和访问权限的功能。

首先,点击Add,选Hosted Repository项:


弹出仓库配置界面,填写对应值,如下:


如图上,填写仓库ID、名称、Provider。Repository Policy选择是开发还是发布仓库,但我们提交本地maven项目到nexus时,我们的项目的版本会自动识别放入对应的仓库中;四是设定上传依赖的仓库路径,可以默认自动生成。

一般创建两个仓库,一个用于发布,一个用于开发。如下:


然后需要为这两个新建仓库建一个组,将对应的仓库访问权限包含在其中。创建组方式类似:点击Add,选Repository Group。填写组仓库信息,配置组包含的仓库。如下:


现在一个属于某个部门的组就定义好了。在本地开发需要做的是,将settings.xml中的nexus仓库的访问地址改成我们的MyRepositoryGroupId的发布地址。

nexus部署配置
6.在nexus中,我们可以做的工作大致有两个:一个是获取依赖,而是上传打包项目。上面已经完成了获取依赖的配置,现在是nexus的部署管理。Nexus部署涉及到权限管理,我们每次往nexus中上传项目时,需要有对应的用户名和密码。此配置在如下位置:

对于权限管理需要配置三个地方,如上图红框所示:Privileges、Roles、Users。

6.1)首先配置privileges,将我们新建的仓库权限管理起来:

新增两个权限,一个是未开发版本库(snapshots),一个为发布版本库(releases)。如下图:


两个都新增后,如图:


6.2)创建可以访问club仓库的角色。点击Roles,进入添加角色:

点击ADD。(问题,第一次添加了privileges后,在Roles中添加权限,居然没有新增项,重启了nexus,新增数据才展示出来)。


6.3)添加用户club-user,为此用户添加club-Role角色权限。

新建用户,如下图。此用户的权限即可拥有管理项目的部署权限。


7.  完成了nexus的仓库、用户权限的配置后,需要将用户信息配置在文件中。需要配置的文件有两个。
7.1)需要配置的第一个文件:project.pom.xml。添加下面的配置,指明项目发布需要放置的仓库url:

 <distributionManagement>
      <repository>
          <id>club-module1-release</id>
          <name>Club Module Release</name>
          <url>http://10.25.119.18:8081/nexus/content/repositories/club-releases/</url>
      </repository>
      <snapshotRepository>
          <id>club-module1-snapshot</id>
          <name>Club Module1 Snapshot</name>
          <url>http://10.25.119.18:8081/nexus/content/repositories/club-snapshots/</url>
      </snapshotRepository>
  </distributionManagement>
7.2)配置第二个文件:${user_home}/.m/settings.xml,添加<servers>标签中添加如下配置,指明发布项目时需要的用户名密码:
<server>
      <id>club-module1-release</id>
      <username>club</username>
      <password>club123</password>
    </server>
    <server>
      <id>club-module1-snapshot</id>
      <username>club</username>
      <password>club123</password>
</server>
这样就算配完了。


原文:https://blog.csdn.net/lh87522/article/details/43281281