简单的maven nexus私服学习

在这里插入图片描述

1.需求

我们现在使用的maven私服是之前同事搭建的,是在公司的一台windows电脑上面,如果出问题会比较难搞,所以现在想将私服迁移到我们公司的测试服务器上,此处简单了解一下私服的一些配置记录一下,方便以后的学习使用。

2.简介

Maven Nexus 私服是一种企业级的仓库管理系统,主要用于管理Maven项目的依赖关系和构建产物。Nexus是由Sonatype公司开发的,它可以作为一个中心化的仓库来存储和分发各种类型的构建工件,包括但不限于Maven、Gradle、npm、Docker等。

Maven Nexus 私服的主要功能包括:

  • 依赖管理:代理外部仓库:Nexus可以作为代理,帮助项目从外部仓库(如Maven Central)下载依赖,同时缓存这些依赖以提高下载速度。
  • 本地仓库:项目可以将构建的工件发布到Nexus的本地仓库,供其他项目或团队成员使用。
  • 版本控制:快照和发布版本管理:Nexus可以区分快照版本(SNAPSHOT)和正式版本(RELEASE),并提供相应的生命周期管理功能。
  • 安全性:身份验证和授权:可以配置Nexus来保护仓库资源,只有经过身份验证和授权的用户才能访问或上传工件。
  • 监控和报告:工件版本历史记录:提供详细的工件版本历史记录,方便追踪工件的变化。
  • 依赖分析:帮助识别项目中使用的依赖及其版本,以及潜在的问题,如过时的依赖或安全漏洞。
  • 集成能力:与其他工具集成:Nexus可以轻松地与CI/CD工具(如Jenkins)、IDEs和其他构建工具集成。
  • REST API:提供了丰富的RESTful API来自动化仓库操作。
  • 用户界面:友好的UI,Nexus提供了一个直观的用户界面,便于管理员和开发者进行仓库管理和工件浏览。

Maven Nexus 私服使用场景:

  • 内部项目依赖管理:在一个组织内部,不同的开发团队可能会共享一些通用库或组件,通过Nexus可以集中管理这些内部依赖。
  • 隔离外部网络:对于无法直接访问互联网的企业环境,Nexus可以作为一个内部的代理,使得开发人员无需直接连接到外部仓库即可获取依赖。
  • 构建产物发布:除了管理依赖之外,Nexus还可以用来发布和管理应用的不同版本,包括快照版本和最终发布的版本。
    通过使用Nexus作为Maven私服,可以有效地提高开发效率,减少网络带宽消耗,并加强依赖管理的安全性和可控性。

3.私服安装

3.1 下载应用包

我们首先需要下载私服包,具体的下载地址,找到自己需要的版本下载即可
在这里插入图片描述

3.2 上传并且解压

上传包到自定义目录,我使用的是/root/nexus目录下,然后进行解压,然后进入到 /root/nexus/nexus-3.49.0-02/etc目录下,然后修改默认启动端口信息,解压后有两个目录信息nexus-3.49.0-02以及sonatype-work,两个目录分别为程序文件以及存储信息目录。

tar -zxvf nexus-3.49.0-02-unix.tar.gz
cd /root/nexus/nexus-3.49.0-02
vim nexus-default.properties

在这里插入图片描述

3.3 启动服务

我们主要进行的是nexus的私服学习,所以此处就是简单启动即可,没有设置为开机自启动。具体步骤我们进入到nexus/bin目录中,执行启动脚本即可

./nexus start

在这里插入图片描述
查看是否已经启动成功,查看进程启动后代表启动成功,启动之后便可以使用ip:8888访问私服了,首次启动稍微有点慢,稍微等一会儿便可以访问

ps -ef | grep nexus

在这里插入图片描述
我们具体的访问地址为 http://192.168.138.134:8888/,首次登录我们需要使用admin登录,然后admin用户的密码我们可以在 /sonatype-work/nexus3/admin.password中获取,然后更新密码即可
在这里插入图片描述
我们点击登录,使用admin用户进行登录,之后我们便可以进行私服的创建了
在这里插入图片描述
在这里插入图片描述

4. 创建私服

4.1 私服的种类

常见的使用的仓库类型有三种,每种仓库作用如下:

类型作用描述
group(仓库组类型)整合多个仓库,统一对外暴露服务地址,方便用户使用,不需要用户配置多个仓库地址
proxy(代理类型)代理仓库,如果有坐标请求到代理仓库,仓库首先确定仓库本地是否存在,存在则返回,不存在则去配置代理地址进行坐标获取
hosted(宿主类型)用户自定义仓库,用户可以将自己的本地仓库部署到此仓库中

4.2 私服命名含义

仓库名称一般都有含义,一般名称含义如下:

名称名称含义
centralmaven中央库,默认从https://repo1.maven.org/maven2/ 获取坐标
release用户私服的稳定发型版本
snapshot用户私服快照版本
public一般将上方的central,release,snapshot三个版本进行整合,在maven的setting.xml配置文件中配置地址,统一对外提供服务

4.3 私服创建

我们了解了私服的种类以及名称含义,那么我们可以本地尝试新建几个仓库,进行测试使用,我们分别建立hosted类型,proxy类型以及group类型仓库,具体的步骤如下:

  • proxy 代理仓库
    我们新增maven-ali-proxy[阿里云代理仓库],点击 新增仓库
    在这里插入图片描述
    然后选择maven2 下的自己需要的仓库种类 proxy
    在这里插入图片描述
    然后填写需要的代理私服名称以及代理私服地址信息
    在这里插入图片描述
    在这里插入图片描述
    点击 View certificate 按钮,查看服务器的SSL证书信息。
    在这里插入图片描述
    最后点击 save 按钮保存即可
    在这里插入图片描述
    这样我们便建立好了一个代理仓库

  • hosted 宿主仓库
    我们开始建立一个宿主仓库,宿主仓库我们建立我们spring boot 应用包上传的仓库,包含snapshot以及release,此处我们以snapshot仓库为例,进行仓库建造,首先还是点击 新增仓库按钮
    在这里插入图片描述
    然后选择maven2 下的自己需要的仓库种类 hosted
    在这里插入图片描述
    填写名称等基本信息
    在这里插入图片描述
    最后点击保存 save 按钮即可
    在这里插入图片描述
    完成snapshot版本仓库后,再使用相同的方法再次新增 release 版本仓库

  • group 仓库
    首先同样是点击 新增仓库按钮
    在这里插入图片描述
    然后选择maven2 下的自己需要的仓库种类 group
    在这里插入图片描述
    然后填写名称信息等基本信息
    在这里插入图片描述
    最后选择其整合的仓库列表信息,选择好后则点击 save按钮 进行保存即可
    在这里插入图片描述

这样我们的几个自定义的仓库便建立好了,那我们在仓库管理页面查看一下
在这里插入图片描述

5. 仓库的使用

在上面新增仓库之后,我们便可以使用新增的仓库了,我们使用的是gourp类型的仓库对外提供服务,我们本地需要配置好jdk环境以及maven环境,再配置自定义的maven setting.xml 文件,然后项目中便可以从库中引入pom坐标了,具体的实现如下

5.1 java & maven环境

我们需要先配置java 以及 maven 环境,我已经准备好了
在这里插入图片描述

5.2 idea 配置maven

在这里插入图片描述
其中 setting-local-nexus.xml 主要配置了server连接信息,以及minor镜像信息,其中server连接信息里面的id 需要与 pom文件中的 distributionManagement.repository.id 保持一致,这样才能上传本地jar包到私服中,里面的配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>D:\apache-maven-3.6.3\repos_local_nexus</localRepository>
  <pluginGroups>
  </pluginGroups>
  <proxies>
  </proxies>

  <servers>
    <server>
        <id>group</id>
        <username>admin</username>
        <password>101022li</password>
    </server>
    <server>
        <id>release</id>
        <username>admin</username>
        <password>101022li</password>
    </server>
    <server>
        <id>snapshot</id>
        <username>admin</username>
        <password>101022li</password>
    </server>
  </servers>
  <mirrors>
	<!-- 配置远程仓库 -->
    <mirror>
        <id>maven-git-group</id>
        <name>nexus repository</name>
        <url>http://192.168.138.134:8888/repository/maven-git-group/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
	
    <!--
	<mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
	-->
  </mirrors>
</settings>

如果想要上传代码到私服,需要添加maven deploy 插件,我的项目的pom文件内容配置具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.git</groupId>
    <artifactId>docker-hello</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <!-- 如果项目部署要给其他人使用,则此值必须填写为true,否则父级pom不上传,会引起子jar包无法下载情况 -->
        <maven.deploy.skip>false</maven.deploy.skip>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <mybatis-plus.version>3.3.0</mybatis-plus.version>
        <fastjson.version>1.2.83</fastjson.version>
        <druid.version>1.2.4</druid.version>

        <hutool.version>5.5.7</hutool.version>
        <lombok.version>1.18.6</lombok.version>
        <mapstruct.version>1.4.1.Final</mapstruct.version>
        <swagger.version>3.0.0</swagger.version>

        <elasticjob.version>3.0.0-RC1</elasticjob.version>
        <druid.version>1.2.4</druid.version>
        <poi-tl.version>1.9.1</poi-tl.version>
        <poi.version>4.1.2</poi.version>
        <easyexcel.version>2.2.8</easyexcel.version>
    </properties>

    <!-- springboot dependency -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
        <relativePath/>
    </parent>
    <!-- 项目级别的maven配置 -->
    <repositories>
        <repository>
            <id>maven-git-group</id>
            <name>maven-git-group</name>
            <url>http://192.168.138.134:8888/repository/maven-git-group/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
    <!-- 部署jar包到私服配置,包含快照版本以及release版本  -->
    <distributionManagement>
        <repository>
            <id>release</id>
            <name>maven-git-release</name>
            <url>http://192.168.138.134:8888/repository/maven-git-release/</url>
        </repository>
        <snapshotRepository>
            <id>snapshot</id>
            <name>maven-git-snapshot</name>
            <url>http://192.168.138.134:8888/repository/maven-git-snapshot/</url>
        </snapshotRepository>
    </distributionManagement>

    <dependencyManagement>
        <dependencies>
            <!-- hutool -->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!-- mapstruct -->
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <!-- 结巴分词 -->
        <dependency>
            <groupId>com.huaban</groupId>
            <artifactId>jieba-analysis</artifactId>
            <version>1.0.2</version>
        </dependency>
        <!-- 验证码 -->
        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!-- 远程执行shell -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>
        <!-- ftp上传下载-->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.3.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.8.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <!-- package -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- maven私服jar包部署插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>${maven-deploy-plugin.version}</version>
                <configuration>
                    <skip>false</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

注意,如果上传的包为非服务用jar包,既服务没有main方法入口类,则使用下面的maven-plugin打包工具,否则提示main.class不存在错误

<build>
    <plugins>
        <!-- 替换 spring-boot-maven-plugin 为 maven-jar-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- maven私服jar包部署插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>${maven-deploy-plugin.version}</version>
            <configuration>
                <skip>false</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

注意: 父级目录的 maven.deploy.skip 属性需要设置为false,否则父级pom层级结构会跳过构建部署操作,其他项目从maven私服引用会提示无法识别 父级项目信息

有时候我们的包可能需要给其他外围使用,可能需要了解接口调用逻辑,所以可能需要代码的源码或者doc注释信息等,maven打包提供了doc文档源码插件,可以直接上传源码文档等信息,这样外围使用就无需问我们直接观察api文档代码注释即可了解接口具体功能,引入插件内容如下:

<!-- 源码source插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<!-- javadoc文档插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.5.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <!-- 使用 additionalOptions 替代 additionalparam -->
                <additionalOptions>
                    <option>-Xdoclint:none</option>
                </additionalOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

6. 测试

6.1 idea install & deploy

配置完毕后,我们点击 spring boot 项目 maven 的 install 即可,执行后效果如下,发现代码已经成功的打包了,我们去maven-git-group 库中查看,包已经下载好了。
在这里插入图片描述
在这里插入图片描述
点击 deploy 部署本地jar包到服务端,具体测试效果如下:
在这里插入图片描述
查看snapshot仓库,代码已经上传,
在这里插入图片描述

6.2 手动上传jar

有时候我们需要手动上传jar包到私服,然后我们再在项目中使用,比如我们测试上传一个名字为SunECMClientTest.jar的一个测试jar包,并且我们使用的配置文件不是默认的setting.xml配置文件,需要使用自定义的setting-local-nexus.xml那么我们具体的上传语句则如下:

mvn deploy:deploy-file -DgroupId='cn.git' -DartifactId='SunECMClient' -Dversion='v3.1.5' -Dpackaging=jar -Dfile='SunECMClientTest.jar' -Durl='http://192.168.138.134:8888/repository/maven-git-release/' -DrepositoryId='release' -s "D:\apache-maven-3.6.3\conf\settings-local-nexus.xml"

执行效果如下:
在这里插入图片描述

各个上传部署参数解释如下:

  • deploy-file : 部署文件到私服
  • DgroupId:坐标组id
  • DartifactId: 坐标的artifactId
  • Dversion:版本编号
  • Dpackaging:打包方式
  • Dfile:需要部署文件
  • Durl:部署私服地址
  • DrepositoryId:部署的私服id,注意此项需要与自己的setting.xml配置文件中server中的id一致,否则没有认证权限,无法上传,提示401
  • s:指定自定义的setting-local-nexs.xml 替换 默认的 setting.xml 配置文件

执行部署语句完成后,我们去私服查看文件是已经上传成功
在这里插入图片描述
部署之后,我们在idea 项目中引入对应的pom坐标,然后重新编译,install 即可下载敌营jar包文件
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐