【Maven】Maven实战总结(一) Maven与Nexus

背景

  Maven是Java项目中常用的项目管理工具,每天工作都要与Maven打交道,最近有时间了,借此机会总结Maven的使用经验
  通过Maven实战总结系列文章去梳理Maven中的技术点
  本篇文章主要介绍公司中的常用的Nexus私服的使用和相关的技术点

Nexus

  简介
    Nexus是用来帮助开发者构建Maven私服的软件(为什么要构建Maven私服可以百度),类似的软件有Apache基金会的Archiva、JFrog的Artifactory和Sonatype的Nexus
    同时,Nexus也是典型的Java  Web应用,Nexus是典型的Java Web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。

  仓库组与仓库
    Nexus中有多种仓库的概念,对应的也内置有多种类型的仓库,这里主要有四种类型
    1.group(仓库组) 
    2.hosted(宿主) 
    3.proxy(代理)
    4.virtual(虚拟)
    每个仓库的格式为maven2或者maven1
    此外,创建仓库时可以通过 Policy(策略) 控制该仓库是Release(发布)/Snapshot(快照)/Mix(混合)类型
    这里以本人目前使用的Nexus私服仓库截图说明不同类型的仓库的用途

     maven-central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
     maven-release:   这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件。
     maven-snapshot: 这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
     3rd_party: 这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得版本构件。
     maven-public:这是一个将多个不同仓库合并聚合为一个仓库组去对外提供服务,如下图
    

 

 

 

     其中名称为nuget-*开头的不是Maven构建相关的仓库,这里不做赘述
    
     这里为了帮助理解宿主仓库,代理仓库和仓库组的概念,通过下图来说明他们之间的用户和概念
         

     从图9-4中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;
     最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容(图中用虚                    线表示),它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。
  实战:创建仓库和仓库组

     1.创建仓库/仓库组

 

 

      2.选定仓库类型

 

      3.设置相关配置(这里选择中央仓库,需要设置代理地址)

  实战: 通过Nexus上传自定义Jar包
 

 

 

 

 

  Maven关联Nexus私服仓库:
       setting.xml部分配置解读

     当需要为Java项目添加Nexus私服上的仓库时,这里有两种方法
     方法一: 针对单个Java项目配置Nexus私服仓库(注意这种方式只对当前Maven项目有效)
          在项目POM中配置Nexus仓库

    <repositories>
        <repository>
            <id>public-snapshots</id>
            <url>Nexus地址/repository/maven-snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>public-snapshots</id>
            <url>http://Nexus地址/repository/maven-public/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

      方法二: 针对全局Java项目配置Nexus私服仓库(推荐
            在Maven的conf目录下的settings文件中配置Nexus仓库
          注意:settings.xml并支持直接配置repositories和pluginRepositories,但是Maven提供了Profile的机制让用户讲Nexus仓库配置
              放到settings中的  Profile文件中

 

<profile>
        <id>public-snapshots</id>
        <repositories>
            <repository>
                <id>public-snapshots</id>
                <url>http://Nexus仓库地址/repository/maven-snapshots/</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
                        <repository>
                <id>public-snapshots</id>
                <url>http://Nexus仓库地址/repository/maven-public/</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>public-snapshots</id>
                <url>http://Nexus仓库地址/repository/maven-public/</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles> 
    <activeProfile>public-snapshots</activeProfile> 
  </activeProfiles>

        该配置中使用了一个id为nexus的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus这个profile激活,
      这样当执行Maven构建的时候,激活的profile会将仓库配置应用到项目中去

  Maven配置仓库镜像
    通过上述将Maven与Nexus关联,能够让Maven项目从Nexus私服下载构件,也就是Jar包,但是该配置无法解决某些包仍然从中央仓库下载
    因此这里需要使用Maven的镜像仓库的功能,并且和Nexus私服结合起来使用,让Maven项目下载的Jar包都统一通过Nexus私服下载
    首先这里说明一下settings文件中镜像仓库的配置

    <mirror>
        <id>alimaven</id>
        <mirrorOf>public-snapshots</mirrorOf>
        <name>aliyun maven</name>
        <url>http://Nexus仓库地址/repository/maven-public/</url>
    </mirror>

    <mirrorOf>的值为public-snapshots,表示该配置为Maven中ProfileId为public-snapshot的镜像,任何对于该仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。另外三个元素id、name、url与一般仓库配置无异,表示该镜像仓库的唯一标识符、名称以及地址,<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像

 

参考资料

  Maven实战 (许晓斌)
    

posted @ 2022-09-24 20:08  听风是雨  阅读(1580)  评论(0)    收藏  举报
/* 看板娘 */