Leave me alone.

Nexus

Posted on By gtahub

Maven私服Nexus3

Maven和Nexus3简介

Maven是一个采用纯java编写的开源项目管理工具
采用一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个pom.xml的文件中,通过该文件Maven可以管理项目的整个生命周期,包括清除、编译、测试、报告、打包、部署等等
目前Apache下绝大多数项目都已经采用Maven进行管理,而Maven本身还支持多种插件,可以方便灵活的控制项目,开发人员的主要任务应该是关注商业逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去依赖jar包,项目部署等
Maven和ant都是软件构件工具(软件管理工具),Maven比Ant更加强大,已经取代了ant.jar包等声明式依赖描述。Maven有jar包的仓库
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当Maven需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载,公司如果没有maven私服,则需要用手动打jar包的方式添加依赖

安装Maven

下载maven

下载地址:https://maven.apache.org/download.html

wget https://dlcdn.apache.org/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz

解压安装

tar -zxvf apache-maven-3.9.2-bin.tar.gz -C /usr/local/

安装java环境

# 上传到虚拟机
scp jdk-8u333-linux-aarch64.tar.gz root@192.168.64.9:~/

# 解压到指定目录下
tar -zxvf jdk-8u333-linux-aarch64.tar.gz -C /usr/local/

添加环境变量

vi /etc/profile

添加如下内容

# JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_333
export JRE_HOME=/usr/local/jdk1.8.0_333/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#MAVEN_HOME
export MAVEN_HOME=/usr/local/apache-maven-3.9.2
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH

重载环境变量

source /etc/profile

验证maven安装

mvn -v
mvn -version

安装Nexus3

下载

下载地址(此地址需要注册账号):https://www.sonatype.com/products/sonatype-nexus-oss-download
另外一个地址(可能需要vpn,切换到usa节点):https://help.sonatype.com/repomanager3/product-information/download/download-archives—repository-manager-3

解压

# 上传到虚拟机
scp nexus-3.56.0-01-unix.tar.gz root@192.168.64.9:~

# 创建目录
mkdir /usr/local/nexus

# 解压到指定目录
tar -zxvf nexus-3.56.0-01-unix.tar.gz -C /usr/local/nexus/

启动

# 切换目录
cd /usr/local/nexus/nexus-3.56.0-01/bin/

# 启动nexus
./nexus start

WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus

# 查看是否启动成功
ps -ef | grep nexus

root     10467     1 17 18:40 pts/1    00:01:20 /usr/local/jdk1.8.0_333/bin/java -server -Dinstall4j.jvmDir=/usr/local/jdk1.8.0_333 -Dexe4j.moduleName=/usr/local/nexus/nexus-3.56.0-01/bin/nexus -......

# 查看nexus端口占用,pid为10467
netstat -tunlp | grep 10467

# 开放8081端口,访问虚拟机 http://192.168.64.9:8081
firewall-cmd --zone=public --add-port=8081/tcp --permanent

# 默认访问读端口为8081,自定义端口需要修改nexus-3.56.0-01/etc/nexus-default.properties文件
vi /usr/local/nexus/nexus-3.56.0-01/etc/nexus-default.properties

使用Nexus

登录nexus

Snipaste_2023-06-26_00-02-09

查看密码

Snipaste_2023-06-26_00-03-57

cat /usr/local/nexus/sonatype-work/nexus3/admin.password

c85b22f4-ba97-4014-8dd0-d29fcc05fac9

仓库介绍

点击“设置-Repositories”,就可以看到仓库,分三种类型

  • proxy:是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用

  • Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。

  • Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存,当项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可

    maven-public:maven-central、maven-release和maven-snapshot三个库的合集

    maven-release:用来存放release版本的jar包

    maven- snapshot:用来存放snapshot版本的jar包

关于maven的snapshot版本与release版本
  • snapshot:代表不稳定、尚处于开发中的版本
  • release:代表稳定的版本
  • Q:什么情况下该用SNAPSHOT?
  • A:协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己,反例如下:
    • 如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升甚至每小时一升,这是对版本号的滥用
    • 如果B不用SNAPSHOT,但一直使用一个单一的release版本号,那当B更新后,A可能并不会接收到更新。因为A使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的包
  • Q:不用Release版本,在所有地方都用SNAPSHOT版本行不行?
  • A:不行,原因如下:
    • 正式环境中不得使用SNAPSHOT版本的库,比如说,今天依赖某个SNAPSHOT版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的SNAPSHOT库。再次构建时,Maven会去远程Repository下载SNAPSHOT的最新版本,构建时用的库就是新的jar文件了,这时正确性就很难保证了

创建阿里云代理仓库

远程地址:http://maven.aliyun.com/nexus/content/groups/public

Snipaste_2023-06-26_16-14-18

Snipaste_2023-06-26_16-14-46

Snipaste_2023-06-26_16-15-42

修改仓库组

Snipaste_2023-06-26_17-23-43

选择阿里云代理仓库添加到右边仓库组

Snipaste_2023-06-26_17-24-11

移动到最上边

Snipaste_2023-06-26_17-24-28

上传依赖

修改本地maven配置
# 查看maven信息
mvn -v

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /usr/local/maven/apache-maven-3.8.6
Java version: 1.8.0_321, vendor: Oracle Corporation, runtime: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "12.3", arch: "x86_64", family: "mac"    

修改配置文件vi /usr/local/maven/apache-maven-3.8.6/conf/settings.xml

<!-- 修改servers标签 -->
<servers>
  <server>
    <id>deploymentRepo-nexus</id>
    <username>nexus用户名</username>
    <password>nexus密码</password>
  </server>
</servers>
maven项目配置

复制仓库地址

Snipaste_2023-06-26_17-34-40

找到pom.xml,添加标签配置

<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.gtahub</groupId>
  <artifactId>test-spring-boot-starter-autoconfig</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>


  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
    <relativePath/>
  </parent>

  <name>test-spring-boot-starter-autoconfig</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure-processor</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <!-- 添加以下配置 -->
  <distributionManagement>
    <!-- release版本仓库 -->
    <repository>
      <!-- id填写本地maven配置文件中servers>>server>>id配置的内容 -->
      <id>deploymentRepo-nexus</id>
      <!-- 地址填刚刚在nexus界面上复制的地址 -->
      <url>http://192.168.64.9:8081/repository/maven-releases/</url>
    </repository>
    <!-- snapshots版本仓库 -->
    <snapshotRepository>
      <id>deploymentRepo-nexus</id>
      <url>http://192.168.64.9:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

</project>
上传到nexus

打开右侧maven选项卡,点击deploy

Snipaste_2023-06-26_17-39-44

查看nexus仓库

Snipaste_2023-06-26_17-40-46

release仓库设置允许重新发布

设置为Allow redeploy代表允许对仓库中的依赖维护升级新版本,如果设置为disable redeploy意味着无法将升级版本上传上来

Snipaste_2023-06-26_17-45-12

下载依赖

修改本地maven配置
vi /usr/local/maven/apache-maven-3.8.6/conf/settings.xml

注释版

<!-- 修改mirrors标签 -->
<mirrors>
  <mirror>
    	<!-- 指定之前添加server的id -->
      <id>deploymentRepo-nexus</id>
      <!-- *代表所有的依赖都从私服找 -->
      <mirrorOf>*</mirrorOf>
    	<!-- 找到 nexus>>Browse>>maven-public 复制url -->
      <url>http://192.168.64.9:8081/repository/maven-public/</url>
  </mirror>
</mirrors>

<!-- 修改profiles标签 -->
<profiles>
    <profile>
        <id>nexus</id>
        <!-- 声明远程仓库 -->
        <repositories>
            <!-- 声明Nexus私服上的仓库 -->
            <repository>
                <!-- 仓库id -->
                <id>nexus</id>
                <!-- 仓库地址 -->
                <url>http://192.168.64.9:8081/repository/maven-public/</url>
                <!-- 是否开启该仓库的release版本下载支持 -->
                <releases>
                    <enabled>true</enabled>
                </releases>
                <!-- 是否开启该仓库的snapshot版本下载支持 -->
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <!-- 声明远程插件仓库 -->
        <pluginRepositories>
            <!-- 声明Nexus私服上的插件仓库 -->
            <pluginRepository>
                <!-- 插件仓库id -->
                <id>nexus</id>
                <!-- 配置的插件仓库的地址 -->
                <url>http://192.168.64.9:8081/repository/maven-public/</url>
                <!-- 是否开启该插件仓库的release版本下载支持 -->
                <releases>
                    <enabled>true</enabled>
                </releases>
                <!-- 是否开启该插件仓库的snapshot版本下载支持 -->
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
</profiles>
<activeProfiles>
    <!-- 激活profile -->
    <activeProfile>nexus</activeProfile>
</activeProfiles>

无注释版

<mirrors>
  <mirror>
    <id>deploymentRepo-nexus</id>
    <mirrorOf>*</mirrorOf>
    <url>http://192.168.64.9:8081/repository/maven-public/</url>
  </mirror>
</mirrors>

<profiles>
  <profile>
    <id>nexus</id>
    <repositories>
      <repository>
        <id>nexus</id>
        <url>http://192.168.64.9:8081/repository/maven-public/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </repository>
    </repositories>
    <pluginRepositories>
      <pluginRepository>
        <id>nexus</id>
        <url>http://192.168.64.9:8081/repository/maven-public/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </pluginRepository>
    </pluginRepositories>
  </profile>
</profiles>
<activeProfiles>
  <activeProfile>nexus</activeProfile>
</activeProfiles>
pom.xml方式
<repositories>
    <repository>
      <id>nexus</id>
      <name>nexus maven</name>
      <url>http://192.168.64.9:8081/repository/maven-public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>nexus</id>
      <name>nexus maven</name>
      <url>http://192.168.64.9:8081/repository/maven-public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>
下载私服依赖到本地

删除本地依赖,默认位置在${user.home}/.m2/repository路径下,如果配置了localRepository,可通过查看配置文件方式找到本地依赖cat /usr/local/maven/apache-maven-3.8.6/conf/settings.xml

Snipaste_2023-06-26_18-04-26

备注

  • starter是一个空项目,其中只引用了starter-autoconfig的依赖。当starter依赖下载完成后,尝试去引入starter-autoconfig中的类时,并不能找到相关的类。在pom.xml中再多引用一下starter-config才能使用其中的类。目前这个算是遗留问题,后续解决会改掉
    • 问题解决:starter中引用的starter-autoconfig的配置如下
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <!-- 
                  问题出现在optional这个选项:
                      当其它项目通过pom引入该项目时,就不会将该项目中的这个依赖被传递依赖引入进去,当你依赖某各工程很庞大或很可能与其他工程的jar包冲突的时候建议加上该选项,可以节省开销,同时减少依赖冲突
            -->
            <optional>true</optional>
            <scope>compile</scope>
          </dependency>
      

参考教程