maven---9使用Nexus创建私服

  • 首先私服是一种衍生出来的特殊的Maven远程仓库,构建私服的好处请看3.5私服
  • 可以帮助大家建立私服的仓库管理软件:Apache基金会的Archiva,JFrog的Artifactory,Sonatype的Nexus,其中Nexus最流行。

1Nexus简介

  • Nexus的诞生也是因为受不了外网的慢速度,所以通过开发web应用把已下载构件缓存起来,下次下载直接从缓存处获取。
  • Nexus分为专业版(收费)和开源版(免费)
    开源版特性:
  • 较小的内存占用(最少28MB)
  • 基于ExtJS的友好界面
  • 基于Restlet的完全REST API
  • 支持代理仓库、宿主仓库和仓库组
  • 基于文件系统,不需要数据库
  • 支持仓库索引和搜索
  • 支持从界面上传Maven构件
  • 细粒度的安全控制

专业版

2安装Nexus

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

2.1下载

下载,下载oss版
版本:nexus-3.1.0-04-win64.zip
jdk要求:1.8及以上。

nexus3.1参考文档

解压后有两个目录(安装目录、数据目录)


nexus-3.1.0-04-win64下文件
  • (安装目录)nexus-3.1.0-04:该目录包含了Nexus运行所需要的文件,如启动脚本,依赖jar包等。(所有相同版本nexus中该目录内容相同)
    目录内容及解释:
LICENSE.txt
NOTICE.txt
bin
deploy
etc
lib
public
system
The installation directory includes a number of nested directories:

LICENSE.txt and NOTICE.txt

contain legal details about the license and copyright notices.
bin

contains the nexus
 startup script itself as well as startup-related configuration files.

etc

contains configuration files.
lib

contains binary libraries related to Apache Karaf.
public

contains public resources of the application.
system

contains all components and plugins that constitute the application.
  • (数据目录)sonatype-work:该目录包含Nexus生成的配置文件、日志、仓库文件等。(需要备份时备份该目录就行)

2.2常见命令

如使用命令行请使用管理员权限打开

2.2.1配置成服务

  • 原因:
    在生产中使用安装Nexus Repository Manager时,必须将其配置为作为服务运行,以便在服务器重新启动后重新启动。 官方文档提供了各平台的配置。
  • Running as a Service on Windows
    使用管理员身份打开命令行
nexus.exe /install <optional-service-name>

默认服务名称为nexus。
安装成功


Paste_Image.png

在系统的服务中可以看到:

nexus安装成系统服务

配置成随系统启动

配置随系统启动

操作服务的其命令

nexus.exe /start <optional-service-name>   开启服务,(也可以在winds的服务界面操作)
nexus.exe /stop <optional-service-name>
nexus.exe /uninstall <optional-service-name> 卸载服务。

2.2.2启动nexus

启动成功,默认端口8081.登录界面,http://localhost:8081/

启动成功登录后界面

方案一
如果你将nexus配置成服务后,1.进入界面系统服务界面,直接启动服务后就可以,或者在命令行采用nexus.exe /start nexus,启动服务。

方案二(推荐方案一)
如果你没有将nexus配置成服务,则需要手动到命令行执行启动命令:
进入到bin/目录下

nexus.exe /run

出现下面文字就启动成功

Started Sonatype Nexus OSS 3.1.0-04

其它命令

nexus.exe start
nexus.exe stop
nexus.exe restart

2.2.3停止nexus

同样如果是配置成系统中的服务,则关闭服务就行,否则直接在命令行执行Ctr+C

2.2.4登录

进入nexus后,输入账号密码登录,admin/admin123

nexus的界面

2.2.5提示

为了在命令行中方便使用nexus.exe命令可以将其配置在系统环境变量中。

3Nexus的仓库与仓库组

Nexus包含了各种类型的仓库概念,包括代理仓库(proxy)、宿主仓库(hosted)、仓库组(group)、虚拟仓库(virtual)。每一种仓库都提供了丰富实用的配置参数,用户根据需求定制。

3.1Nexus内置的仓库

  • 对于4种类型的仓库,Maven内置了一些仓库,这些仓库用户可以不用在配置了。每个仓库的格式为maven2或maven1,此外仓库还有一个属性Policy(策略),表示仓库为发布(Release)版本还是快照(Snapshot)版本仓库。

    • 代理仓库主要是提供下载缓存构件和插件、如果只是从远程仓库下载构件和插件、那么代理仓库完全足够。
    • 宿主仓库主要用于存放项目部署的构件或者第三方构件。
    • 仓库组将相同策略的仓库聚合,并通过一致的地址提供服务。(因为项目有可能依赖的中央仓库的release插件和某个宿主仓库中release的插件,为了方便可以配置仓库组作为仓库,而不去单独配置两个仓库)。
  • 对于格式为maven1的仓库和虚拟类型的仓库不做介绍,这两种都是为maven1服务的。

  • Maven Central: 代理中央仓库、策略为Release、只会下载和缓存中央仓库中的发布版本构件。

  • Release: 策略为Release的宿主仓库、用来部署组织内部的发布版本内容。

  • Snapshot: 策略为Snapshot的宿主仓库、用来部署组织内部的快照版本内容。

  • 3rd party: 策略为Release的宿主仓库类型、用来部署无法从公共仓库获取的第三方发布版本构件、如oracle连接驱动jar包。

  • ApacheSnapshot: 策略为Snapshot的代理仓库、用来代理ApacheMaven仓库的快照版本构件。

  • Codehaus Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件。

  • Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。

  • PublicRepositories:该仓库将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。

  • Public Snapshot Repositories:该仓库将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。

3.2案例理解概念

公司内部建立Nexus私服为公司项目提供服务,公司Maven项目X。

  • X依赖开源类库如JUnit类,这些构件可以从Maven中央仓库获得,因此Maven Central代理仓库会被用来代理中央仓库的内容,并在私服上缓存下来。

  • X还来依赖与Google Code的某个项目,其构件不在中央仓库,只存在于Google Code仓库中,所以Google Code代理仓库会被用来缓存这样的构件。

  • X还依赖于Oracle的JDBC驱动,由于版权原因,该类库无法从公共仓库获得,因此公司管理员将其部署到3rd party宿主仓库中,供X使用。

  • X的快照版构件成功后会被部署到Snapshots宿主仓库中,供其他项目使用,当X发布正式版本的时候,其构件会被部署到Release宿主仓库中。

  • 由于X用到了上述列表中的很多仓库,为每个仓库声明Maven配置又比较麻烦,因此可以直接使用仓库Public Repositories和Public Snapshot Repositories。当X需要JUnit的时候,她直接从PublicRepositories下载,Public Repositories会选择Maven Central提供实际的内容。

3.3Nexus仓库分类的概念

Maven可以直接从宿主仓库下载构件,也可以从代理下载,为了方便还可以从仓库组下载构件,仓库组没有时间内容,它会转向其包含的宿主仓库或者代理仓库获取实际的构件。

各种类型的Nexus仓库

3.4创建Nexus仓库

创建按钮
选择仓库格式和类型

3.4.1宿主仓库配置信息

宿主仓库配置信息

3.4.2代理仓库配置信息

代理仓库配置信息

案例

  • 发生错误条件:第一次搭建nexus私服在局域网内的一台服务器上,而且那台服务器没有连接外网,所以私服上还没有任何构件。局域网中的A电脑进行了下面操作,A在本地maven仓库之前已经有了maven-reporting-api构件,通过镜像配置本地maven项目从私服获取所有构件,然后执行mvn clean deploy出现以下错误。下面是一种错误分析。
缓存失败信息后,再次连接又出错
  • 错误分析:(正确,测试过)
    a. 根据提示说明本地缓存了这个错误,解决方法由两个:

  • 一是等maven检查远程仓库的更新间隔时间到了(更新间隔时间是maven从远程仓库(nexus)检查最新构件的更新策略updataPolicy。默认一天检查一次。详细请看maven---6仓库--->4远程仓库配置)。

  • 另一个是强制让maven检查远程仓库进行更新,即不再等它时间到,使用参数U来强制更新。

  • 解决步骤:(如果解决不了看下面)

    • 1.让私服连接上外网,在本地仓库中删除掉maven-reporting-api构件。
    • 2.执行mvn clean deploy -U
  • 再解决
    如果上面的1,2执行完后没解决。那么应该是nexus上远程代理仓库在没有网的情况下下载构件,但是下载失败了,而nexus代理仓库对“没找到构件”这种情况会缓存一天(看3.4.2代理仓库配置信息),所以即使你本地按照上面设置了,但是nexus这里依然给你它缓存的结果。进行下面的设置后在执行上面2个步骤,即可解决。

    • 1.到nexus上设置要访问的远程代理仓库对待“没有发现构件的缓存时间设为0”。
设置缓存错误结果时间为0
  • 再次执行mvn clean deploy -U,就可以了。

3.4.3仓库组配置信息

仓库组配置信息

4配置Maven从Nexus下载构件

4.1确定nexus上仓库的地址。

获取要配置nexus仓库的地址

http://localhost:8081/repository/maven-public/

4.2在单个maven项目中配置

4.3配置全局范围(推荐)

  • 想通过一次配置就让本机所有maven项目都使用自己的私服。答案:在setting.xml中配置。

4.3.1在setting中配置访问私服(方法一)

  • settings.xml中不能配置repositories和pluginRepositories,但是提供了Profile机制,能让用户将仓库配置放到settings.xml中的Profile中。
<settings>
 ...
    <!--配置Nexus仓库-->
    <profile>
       <id>nexus</id>
       <repositories>
        <repository>
          <id>nexus</id>
          <name>Nexus Repository</name>
          <url>http://localhost:8081/repository/maven-public/</url>
          <layout>default</layout>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
         <releases>
            <enabled>true</enabled>
          </releases>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus Repository</name>
            <url>http://localhost:8081/repository/maven-public/</url>
            <layout>default</layout>
            <snapshots>
              <enabled>true</enabled>
            </snapshots>
            <releases>
              <enabled>true</enabled>
            </releases>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <!--激活Nexus仓库配置  -->
  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
...
</settings>
  • 配置中使用一个id=nexus的profile,这个profile包含了相关的仓库配置,同时使用activeProfile元素将这个profile激活。

4.3.2通过镜像配置私服(方法二)(推荐)

  • 通过(方法一)在settings.xml配置私服仓库后,项目依然会时不时访问中央仓库和maven项目中配置的其它远程仓库,而不是全部访问私服,此时就需要配置镜像。maven---6仓库--->7镜像
  • 让所有对远程仓库(不论是中央仓库还是第三方仓库如:JBoss Maven库)的请求都转到nexus仓库,同时nexus的仓库组要包含所有maven项目需要请求的代理仓库(即需要的代理所有需要的远程仓库)。
    同样在settings.xml中配置镜像:
<settings>
 ...

    <!--配置镜像-->
 <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>nexus mirror for all repositry</name>
      <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>
    <!--配置Nexus仓库-->
    <profile>
       <id>nexus</id>
       <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots><enabled>true</enabled>  </snapshots>
         <releases><enabled>true</enabled>  </releases>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Central pluginRepository</name>
            <url>https://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots><enabled>true</enabled></snapshots>
            <releases><enabled>true</enabled></releases>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <!--激活Nexus仓库配置  -->
  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
...
</settings>

解释

  • 问:配置的镜像*会拦截所有的仓库请求,为什么还要配置central的仓库及插件仓库呢?
  • 答:1.首先仓库名称取为central,会覆盖超级Pom中的中央仓库配置。2.由于所有仓库请求都转向了镜像配置的地址,所以配置的仓库和插件仓库的url无效。3.主要目的:开启对快照版本下载的支持,当Maven需要下载发布版或者快照版构件的时候,它首先检查central,看该类型构件是否支持,得到正面回答后,再根据镜像匹配规则转而访问私服仓库地址。(此时私服仓库有可能支持快照也有可能不支持,主要看私服仓库配置)。

5部署构件至Nexus

5.1需求说明

  • 对于Nexus的宿主仓库,他们的主要作用是存储组织内部的,或者一些无法从公共仓库获得的第三方构件,供大家下载,所以需要1.配置maven自动不熟构件到nexus的宿主仓库中。2.或者通过界面手动上传构件。

5.2部署Maven项目构件至Nexus

开发生成的快照版本部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。

5.2.1获取Nexus中确定要部署的宿主仓库的连接

要部署到的远程仓库

http://localhost:8081/repository/maven-releases/
http://localhost:8081/repository/maven-snapshots/

5.2.2配置项目pom

 <!--配置项目生成的构件部署到Nexus私服上 -->
  <distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <name>Nexus ReleaseRepository</name>    
        <url>http://localhost:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>Nexus SnapshotsRepository</name>      
        <url>http://localhost:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

5.2.3在settings.xml配置仓库认证信息

因为不是所有人都可以部署构件到nexus仓库中的,关于认证信息就是拥有管理该仓库的用户,在下面有讲。

<settings>
 ....
  <servers>
 <!--配置nexus仓库认证信息-->
    <server>  
        <id>nexus-releases</id>  
        <username>admin</username>  
        <password>****</password>  
    </server>  
    <server>  
        <id>nexus-snapshots</id>  
        <username>admin</username>  
        <password>****</password>  
    </server>  
  </servers>
...
</settings>

5.2.4使用mvn命令

在项目根目录下执行部署命令,或者在开发工具中执行部署命令

mvn clean deploy

5.3手动部署第三方构件至Nexus仓库

  • 对于一些开源或者有版权的jar文件,他们在远程仓库没有,所以只能将他们先下载下来,再手动上传到nexus私服上。

5.3.1确定Nexus中要部署的3rd-party宿主仓库连接

该宿主仓库一般转为用来存放第三方构件的仓库。


Paste_Image.png

http://localhost:8081/repository/3rd-party/

5.3.2在settings.xml配置3rd-party仓库认证信息

该信息在下面使用

<server>  
        <id>nexus-3rd-party</id>  
        <username>admin</username>  
        <password>admin123</password>  
    </server>  

5.3.3命令行部署到nexus上

通过命令行来操作部署G:\5jar\edu.mit.jwi_2.3.3_jdk.jar目录下的jar包到nexus的3rd-party仓库中。
其中需要你自定义groupId,artifactId,version,packaging信息。其中的-Dfile填写jar的位置,-Durl填写nexus中3rd-party的连接,-DrepositoryId填写在settings.xml配置的认证信息的id。

mvn deploy:deploy-file  -Dfile=G:\5jar\edu.mit.jwi_2.3.3_jdk.jar -DgroupId=local.edu.stanford -DartifactId=edu.mit.jwi_jdk -Dversion=2.3.3 -Dpackaging=jar    -Durl=http://localhost:8081/repository/3rd-party/ -DrepositoryId=nexus-3rd-party

部署成功


手动部署到3rd-party仓库的构件
  • 3rd-party仓库设置了相同依赖不允许重复部署,所以再次部署会失败。

关于部署第三方构件到本地仓库,请查看maven---6仓库---->3.2.2.3安装第三方构件到本地仓库

6Nexus的权限管理

6.1需求

处于安全考虑,在组织内部中如果希望只有管理员才能配置Nexus,只有某些团队成员才能部署构件,或者更细要求,例如每个项目都有自己的Nexus宿主仓库,且只能部署项目构件至该仓库,Nexus提供了全面的权限控制特性,能让用户自由根据需求配置Nexus用户(user)、角色(role)、权限(privilege).

6.2介绍

nexus中关于安全的官方详细介绍

nexus操作界面

6.1.1权限privilege

  • Nexus是基于权限(privilege)做访问控制的,服务器每一个资源都有相应的权限来控制,用户只需特定操作必要拥有必要的权限。
权限

6.1.2角色(role)

  • 管理员必须以角色(role)的方式将权限赋予Nexus用户,例如访问nexus中搜索页面需要nx-search-read权限,而nexus中配置的角色nx-anonymous角色就拥有该权限,将这个角色分配给某个用户就可以访问nexus中搜索页面了。角色还可以包含一个或多个角色。
nx-anonymous角色拥有的权限

6.1.3用户(user)

  • 用户可以被赋予一个或多个角色,角色可以包含一个或者多个权限,角色可以包含一个或多个其它角色。


    用户

7Nexus的调度任务

  • Nexus提供了一系列可配置的调度任务来方便用户管理系统,用户可以设定这些任务运行方式,例如:每天、每周、手动等,任务调度会在适当的时候在后台运行,当然用户还是能够在界面观察他们的状态。
  • Nexus包含了以下几种类型的调度任务:


    任务类型
  • 创建任务


    Nexus管理界面左边最下方
创建任务

8其他私服软件

还没接触....

留言

有什么不懂的一起探讨一下吧,欢迎留下宝贵意见,喜欢就点个赞吧(哈哈),多谢鼓励。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容