Maven系列第5篇:私服详解
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。
这是maven系列第5篇。
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
环境
-
maven3.6.1
-
开发工具idea
-
jdk1.8
本篇内容
-
私服介绍
-
windows中安装nexus私服
-
linux中安装nexus私服
-
nexus私服中各种仓库详解
-
配置本地Maven从nexus下载构件
-
将本地构件发布到私服的2种方式详解
-
总结
上一篇文章中有提到了私服,我们再来回顾一下私服相关的内容。
私服
私服也是远程仓库中的一种,我们为什么需要私服呢?
如果我们一个团队中有几百个人在开发一些项目,都是采用maven的方式来组织项目,那么我们每个人都需要从远程仓库中把需要依赖的构件下载到本地仓库,这对公司的网络要求也比较高,为了节省这个宽带和加快下载速度,我们在公司内部局域网内部可以架设一台服务器,这台服务器起到一个代理的作用,公司里面的所有开发者去访问这个服务器,这台服务器将需要的构件返回给我们,如果这台服务器中也没有我们需要的构件,那么这个代理服务器会去远程仓库中查找,然后将其先下载到代理服务器中,然后再返回给开发者本地的仓库。
还有公司内部有很多项目之间会相互依赖,你可能是架构组的,你需要开发一些jar包给其他组使用,此时,我们可以将自己jar发布到私服中给其他同事使用,如果没有私服,可能需要我们手动发给别人或者上传到共享机器中,不过管理起来不是很方便。
总体上来说私服有以下好处:
-
加速maven构件的下载速度
-
节省宽带,加速项目构建速度
-
方便部署自己的构件以供他人使用
-
提高maven的稳定性,中央仓库需要本机能够访问外网,而如果采用私服的方式,只需要本机可以访问内网私服就可以了
有3种专门的maven仓库管理软件可以用来帮助我们搭建私服:
-
Apache基金会的archiva
http://archiva.apache.org/ -
JFrog的Artifactory
https://jfrog.com/artifactory/ -
Sonatype的Nexus
https://my.sonatype.com/
这些都是开源的私服软件,都可以自由使用。用的最多的是第三种Nexus,本文我们主要以这个来讲解,其他2种有兴趣的朋友可以去研究一下。
Windows10中安装Nexus私服
nexus是java开发的,所以运行的时候需要有java环境的支持。
安装jdk
安装jdk1.8,可以参考Maven系列第2篇:安装、配置、mvn运行过程详解这篇文章中有介绍
下载nexus
下面提供两种下载方式:官网下载、百度网盘下载,百度网盘速度会快一些。
官网和百度网盘中都包含了windows、linux、mac版本nexus安装文件。
建议大家使用网盘中的资源,保持和本文环境一致,可以避免出错。
nexus下载地址
https://help.sonatype.com/repomanager3/download

百度网盘下载地址
链接:https://pan.baidu.com/s/1N8A4JH1Ykvetn3xs05LszA
提取码:vig6
复制这段内容后打开百度网盘手机App,操作更方便哦
解压latest-win64.zip
latest-win64.zip解压之后会产生两个文件目录nexus-3.19.1-01和sonatyp-work

启动nexus
cmd中直接运行nexus-3.19.1-01/bin/nexus.exe /run ,如下:
D:\installsoft\maven\nexus\nexus-3.19.1-01\bin>nexus.exe /run
如果输出中出现了下面的异常请忽略
java.io.UnsupportedEncodingException: Encoding GBK is not supported yet (feel free to submit a patch)
浏览器中打开
http://localhost:8081/
效果如下:

登录Nexus
点击上图右上角的Sign in,输入用户名和密码,nexus默认用户名是admin
nexus这个版本的密码是第一次启动的时候生成的,密码位于下面的文件中:
安装目录/sonatype-work/nexus3/admin.password
登录成功后会弹出一些设置,如下:

点击Next,设置新的登录密码(新密码要保存好),如下:

点击Next->Finish完成设置。

其他一些常见的操作
停止Nexus的命令
启动的cmd窗口中按:ctrl+c,可以停止Nexus。
修改启动端口
默认端口是8081,如果和本机有冲突,可以在下面的文件中修改:
nexus-3.19.1-01\etc\nexus-default.properties
nexus使用java开发的web项目,内置了jetty web容器,所以可以直接运行。
Linux安装Nexus私服
下载安装包
百度网盘中下载linux版本的nexus安装包,选择latest-unix.tar.gz文件,下载地址如下:
链接:https://pan.baidu.com/s/1N8A4JH1Ykvetn3xs05LszA
提取码:vig6
复制这段内容后打开百度网盘手机App,操作更方便哦
将上面的安装包放在/opt/nexus/目录。
解压
[root@test1117 nexus]# tar -zvxf latest-unix.tar.gz
[root@test1117 nexus]# ls
latest-unix.tar.gz nexus-3.19.1-01 sonatype-work
启动
[root@test1117 bin]# /opt/nexus/nexus-3.19.1-01/bin/nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
我上面使用的是root用户操作的,为了安全性,你们最好自己创建个用户来操作。
开放端口
在/etc/sysconfig/iptables文件中加入下面内容:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
执行下面命令,让上面配置生效:
[root@test1117 bin]# service iptables restart
Redirecting to /bin/systemctl restart iptables.service
验证效果
访问
http://nexus私服所在的机器ip:8081/
出现下面效果表示一切ok。

登录
用户名为admin,密码在
/opt/nexus/sonatype-work/nexus3/admin.password
登录之后请请立即修改密码。
Nexus中仓库分类
前面我们说过,用户可以通过nexus去访问远程仓库,可以将本地的构件发布到nexus中,nexus是如何支撑这些操作的呢?
nexus中有个仓库列表,里面包含了各种各样的仓库,有我们说的被代理的第三方远程仓库,如下图:

上图中是nexus安装好默认自带的仓库列表,主要有3种类型:
-
代理仓库
-
宿主仓库
-
仓库组
代理仓库
代理仓库主要是让使用者通过代理仓库来间接访问外部的第三方远程仓库的,如通过代理仓库访问maven中央仓库、阿里的maven仓库等等。代理仓库会从被代理的仓库中下载构件,缓存在代理仓库中以供maven用户使用。
我们在nexus中创建一个阿里云的maven代理仓库来看下过程如下。
Nexus仓库列表中点击Create repository按钮,如下图:

进入添加页面,选择maven2(proxy),这个表示代理仓库,如下图:

输入远程仓库的信息,如下图:

第一个红框中输入仓库名称:maven-aliyun第二个红框选择:Release,表示从这个仓库中下载稳定版的构件第三个红框输入阿里云仓库地址:https://maven.aliyun.com/repository/public
点击底部的Create repository按钮,创建完成,如下图:

宿主仓库
宿主仓库主要是给我们自己用的,主要有2点作用
-
将私有的一些构件通过nexus中网页的方式上传到宿主仓库中给其他同事使用
-
将自己开发好一些构件发布到nexus的宿主仓库中以供其他同事使用
上面这2种操作,一会稍后会详解以及演示操作过程。
仓库组
maven用户可以从代理仓库和宿主仓库中下载构件至本地仓库,为了方便从多个代理仓库和宿主仓库下载构件,maven提供了仓库组,仓库组中可以有多个代理仓库和宿主仓库,而maven用户只用访问一个仓库组就可以间接的访问这个组内所有的仓库,仓库组中多个仓库是有顺序的,当maven用户从仓库组下载构件时,仓库组会按顺序依次在组内的仓库中查找组件,查找到了立即返回给本地仓库,所以一般情况我们会将速度快的放在前面。
仓库组内部实际上是没有构件内容的,他只是起到一个请求转发的作用,将maven用户下载构件的请求转发给组内的其他仓库处理。
nexus默认有个仓库组maven-public,如下:

点击一下maven-public这行记录,进去看一下,如下图:

上图中第一个红框是这个仓库组对外的一个url,我们本地的maven可以通过这个url来从仓库组中下载构件至本地仓库。
第二个红框中是这个仓库组中的成员,目前包含了3个仓库,第1个是宿主的releases版本仓库,第1个是宿主快照版本的仓库,第3个是代理仓库(maven社区中央仓库的代理)。
刚才我们新增的
maven-aliyun在左边,我们将其也加到右边的仓库成员(Members)列表,然后将maven-aliyun这个仓库放在第3个位置,这个仓库的速度比maven-central要快一些,能加速我们下载maven构件的速度,如下图:

配置本地Maven从nexus下载构件
介绍2种方式
方式1:pom.xml的方式
本次我们就从nexus默认仓库组中下载构件,先获取仓库组对外的地址,点击下图中的copy按钮,获取仓库组的地址:


修改pom.xml,加入如下内容:
注意下面
url的地址为上面复制的地址。
<repositories><repository><id>maven-nexus</id><url>http://localhost:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
由于nexus私服需要有用户名和密码登录才能访问,所以需要有凭证,凭证需要在settings.xml文件中配置,在~/.m2/settings.xml文件的servers元素中加入如下内容:
<server><id>maven-nexus</id><username>admin</username><password>admin123</password>
</server>
注意上面的
server->id的值和pom.xml中repository->id的值一致,通过这个id关联找到凭证的。server元素中的username和password你们根据自己的去编辑,我这边密码设置的是admin123
方式1示例
创建一个maven项目,打开idea,点击File->New->Project,选择Maven,如下:

点击Next,输入项目坐标信息,如下:

点击Next,输入Project name 为maven-chat05,如下:

点击Finish,创建成功,如下:

配置一下idea的maven环境,点击File->Settings,如下图:

点击上面的OK完成配置。
还原~/.m2/settings.xml的配置到初始状态,操作如下:
将M2_HOME/conf/settings.xml复制熬~/.m2/settings.xml目录,如果存在先备份一个,然后进行覆盖。
修改上面idea项目中的pom.xml文件,内容如下:
<?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>com.javacode2018</groupId><artifactId>maven-chat05</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies><repositories><repository><id>maven-nexus</id><url>http://localhost:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories></project>
删除本地仓库中以下几个目录:
~\.m2\repository\com\alibaba
maven-chat05项目目录中打开cmd运行:
mvn compile
见证奇迹的时刻,输出如下:
D:\code\IdeaProjects\maven-chat05>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat05 >--------------------
[INFO] Building maven-chat05 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from maven-nexus: http://localhost:8081/repository/maven-public/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.pom
Downloaded from maven-nexus: http://localhost:8081/repository/maven-public/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.pom (9.7 kB at 5.1 kB/s)
Downloading from maven-nexus: http://localhost:8081/repository/maven-public/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.jar
Downloaded from maven-nexus: http://localhost:8081/repository/maven-public/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.jar (658 kB at 70 kB/s)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat05 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat05 ---
[INFO] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.083 s
[INFO] Finished at: 2019-11-13T15:45:44+08:00
[INFO] ------------------------------------------------------------------------
从输出中可以看出fastjson这个jar包从maven-nexus中下载了,下载地址正是我们nexus私服中的那个地址。
方式2:镜像方式
关于什么是镜像,这里就不在做说明了,上篇文章中有介绍,可以移步过去看一下:仓库详解
镜像的方式主要修改~/.m2/setting.xml文件,需要修改2处理。
第1处:setting.xml的mirrors元素中加入如下配置:
<mirror><id>mirror-nexus</id><mirrorOf>*</mirrorOf><name>nexus镜像</name><url>http://localhost:8081/repository/maven-public/</url>
</mirror>
上面
mirrorOf配置的*,说明所有远程仓库都通过该镜像下载构件。url:这个为nexus中仓库组的地址,上面方式一中有说过。
第2处:由于nexus的url是需要用户名和密码才可以访问的,所以需要配置访问凭证,在`~/.m2/settings.xml`文件的`servers`元素中加入如下内容:
<server><id>mirror-nexus</id><username>admin</username><password>admin123</password>
</server>
注意上面的
server->id的值和mirror->id的值需要一致,这样才能找到对应的凭证。
方式2示例
还是以方式1中的maven项目maven-chat05为例。
修改pom.xml,内容如下:
<?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>com.javacode2018</groupId><artifactId>maven-chat05</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies></project>
~/.m2/settings.xml的servers元素中加入下面内容:
<server><id>mirror-nexus</id><username>admin</username><password>admin123</password>
</server>
注意上面username、password根据你们自己的进行配置。
~/.m2/settings.xml的mirrors元素中加入下面内容:
<mirror><id>mirror-nexus</id><mirrorOf>*</mirrorOf><name>nexus镜像</name><url>http://localhost:8081/repository/maven-public/</url>
</mirror>
删除本地仓库中以下几个目录:
~\.m2\repository\com\alibaba
maven-chat05项目目录中打开cmd运行:
mvn compile
见证奇迹的时刻,输出如下:
D:\code\IdeaProjects\maven-chat05>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat05 >--------------------
[INFO] Building maven-chat05 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom (0 B at 0 B/s)
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom (0 B at 0 B/s)
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/maven-parent/22/maven-parent-22.pom
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/maven-parent/22/maven-parent-22.pom (0 B at 0 B/s)
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/apache/11/apache-11.pom
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/apache/11/apache-11.pom (0 B at 0 B/s)
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.jar
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.jar (0 B at 0 B/s)
Downloading from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-compiler-plugin/3.1/maven-compiler-plugin-3.1.pom
Downloaded from mirror-nexus: http://localhost:8081/repository/maven-public/org/apache/maven/plugins/maven-compiler-plugin/3.1/maven-compiler-plugin-3.1.pom (0 B at 0 B/s)
[INFO] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:23 min
[INFO] Finished at: 2019-11-13T16:05:43+08:00
[INFO] ------------------------------------------------------------------------
输出内容比较多,只截取了部分输出,从输出中可以看出fastjson这个jar包从mirror-nexus中下载了,下载地址正是我们nexus私服中的那个地址,镜像的方式起效了,是不是感觉很爽,哈哈!
本地构件发布到私服
经常用到的有2种
-
使用maven部署构件至nexus私服
-
手动部署第三方构件至nexus私服:比如我们第三方发给我们的一个包,比如短信发送商的jar包,这个包远程仓库是不存在的,我们要把这个包上传到私服供所有开发使用。
下面我们来看一下这两种如何操作。
使用maven部署构件至nexus私服
我们创建maven项目的时候,会有一个pom.xml文件,里面有个version元素,这个是这个构件的版本号,可以去看一下上面我们刚创建的maven-chat05,默认是1.0-SNAPSHOT,这个以-SNAPSHOT结尾的表示是个快照版本,叫做SNAPSHOT版本,快照版本一般是不稳定的,会反复发布、测试、修改、发布。而最终会有一个稳定的可以发布的版本,是没有-SNAPSHOT后缀的,这个叫做release版本。
而nexus私服中存储用户的构件是使用的宿主仓库,这个我们上面也有说过,nexus私服中提供了两个默认的宿主仓库分别用来存放SNAPSHOT版本和release版本,如下图:

上图中第1个红框的maven-releases宿主仓库用来存放用户自己release版本的构件。
第2个红框的maven-snapshots宿主仓库用来存放用户snapshot版本的构件。
上面两个仓库的地址可以点击后面的copy按钮获取。
操作分为3步
第一步:修改pom.xml配置
我们需要将本地maven项目的构件发布到上面宿主仓库中,需要修改项目中pom.xml的配置,加入下面内容:
<distributionManagement><repository><id>release-nexus</id><url>http://localhost:8081/repository/maven-releases/</url><name>nexus私服中宿主仓库->存放/下载稳定版本的构件</name></repository><snapshotRepository><id>snapshot-nexus</id><url>http://localhost:8081/repository/maven-snapshots/</url><name>nexus私服中宿主仓库->存放/下载快照版本的构件</name></snapshotRepository>
</distributionManagement>
上面2个url分别是上图中两个宿主仓库的地址。
第二步:修改settings.xml
上面地址需要登录才可以访问,所以需要配置凭证,这个需要在~/.m2/settings.xml中进行配置,在这个文件的servers元素中加入:
<server><id>release-nexus</id><username>admin</username><password>admin123</password>
</server><server><id>snapshot-nexus</id><username>admin</username><password>admin123</password>
</server>
注意上面第1个
server->id的值需要和pom.xml中的distributionManagement->repository->id的值一致。第2个
server->id的值需要和pom.xml中的distributionManagement->snapshotRepository->id的值一致。
第三步:执行`mvn deploy`命令
执行这个命令的时候,会对构件进行打包,然后上传到私服中。
这命令的原理,后面的文章中会具体介绍。
示例效果
我们来感受一下效果。
按照上面的配置修改maven-chat03/pom.xml文件和本地的~/.m2/settings.xml文件。
maven-chat05项目目录中打开cmd运行:
mvn deploy
见证奇迹的时刻,输出如下:
D:\code\IdeaProjects\maven-chat05>mvn deploy
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat05 >--------------------
[INFO] Building maven-chat05 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat05 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat05 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat05 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\maven-chat05\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat05 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat05 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat05 ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ maven-chat05 ---
[INFO] Installing D:\code\IdeaProjects\maven-chat05\target\maven-chat05-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat05\1.0-SNAPSHOT\maven-chat05-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\maven-chat05\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat05\1.0-SNAPSHOT\maven-chat05-1.0-SNAPSHOT.pom
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ maven-chat05 ---
Downloading from snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-metadata.xml
Uploading to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-chat05-1.0-20191113.083820-1.jar
Uploaded to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-chat05-1.0-20191113.083820-1.jar (1.8 kB at 11 kB/s)
Uploading to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-chat05-1.0-20191113.083820-1.pom
Uploaded to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-chat05-1.0-20191113.083820-1.pom (1.2 kB at 10 kB/s)
Downloading from snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/maven-metadata.xml
Uploading to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-metadata.xml
Uploaded to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/1.0-SNAPSHOT/maven-metadata.xml (772 B at 9.2 kB/s)
Uploading to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/maven-metadata.xml
Uploaded to snapshot-nexus: http://localhost:8081/repository/maven-snapshots/com/javacode2018/maven-chat05/maven-metadata.xml (286 B at 3.4 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.156 s
[INFO] Finished at: 2019-11-13T16:38:20+08:00
[INFO] ------------------------------------------------------------------------
输出内容中有Uploading to snapshot-nexus、Uploaded to snapshot-nexus ,snapshot-nexus正是我们在pom.xml配置的快照版本的地址,上面输出内容中有具体的地址,和快照的地址也是一样的,上传成功了。
我们去nexus私服中看一下,访问nexus私服中快照版本仓库的地址:
http://localhost:8081/repository/maven-snapshots/
出现如下页面:

点击上面的bowse连接,如下图,我们的构件上传成功了:

如果其他同事需要使用上面这个构件,只需要点击下图中的pom文件,右边会显示构件的坐标,然后可以拿去使用了,如下图:

上面是将快照版本的发布到了nexus私服的快照宿主仓库了,下面我们再来操作一下将release稳定版本的发布到nexus私服,如下:
修改pom.xml文件的版本号,将-SNAPSHOT后缀去掉,去掉之后表示是release版本的了,如下:
<version>1.0</version>
cmd命令中执行:
mvn deploy
输出:
D:\code\IdeaProjects\maven-chat05>mvn deploy
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat05 >--------------------
[INFO] Building maven-chat05 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat05 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat05 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat05 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\maven-chat05\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat05 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat05 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat05 ---
[INFO] Building jar: D:\code\IdeaProjects\maven-chat05\target\maven-chat05-1.0.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ maven-chat05 ---
[INFO] Installing D:\code\IdeaProjects\maven-chat05\target\maven-chat05-1.0.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat05\1.0\maven-chat05-1.0.jar
[INFO] Installing D:\code\IdeaProjects\maven-chat05\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat05\1.0\maven-chat05-1.0.pom
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ maven-chat05 ---
Uploading to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/1.0/maven-chat05-1.0.jar
Uploaded to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/1.0/maven-chat05-1.0.jar (1.7 kB at 9.6 kB/s)
Uploading to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/1.0/maven-chat05-1.0.pom
Uploaded to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/1.0/maven-chat05-1.0.pom (1.2 kB at 12 kB/s)
Downloading from release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/maven-metadata.xml
Uploading to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/maven-metadata.xml
Uploaded to release-nexus: http://localhost:8081/repository/maven-releases/com/javacode2018/maven-chat05/maven-metadata.xml (304 B at 4.3 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.646 s
[INFO] Finished at: 2019-11-13T16:48:44+08:00
[INFO] ------------------------------------------------------------------------
输出中有release-nexus,说明使用了pom.xml中的distributionManagement->repository->id的值,上传地址是http://localhost:8081/repository/maven-releases。
打开nexus私服中release地址:
http://localhost:8081/repository/maven-releases/

点击上面的browse连接,如下:

成功了,是不是感觉很爽。
手动部署构件至nexus私服
操作步骤
手动上传只支持发布稳定版本的构件,操作过程如下图:
登录nexus,按照下图的步骤依次点击:

图中第一行maven-releases宿主仓库就是存放用户自己构件的仓库,点击上图中列表中的第一行,进入上传页面,如下图:

上面页面中点击Browse选择本地的构件,然后输入其他坐标信息,点击Upload完成上传操作。
示例效果
我们把maven-chat05\target\maven-chat05-1.0.jar上传上去,如下:

点击Upload完成上传操作。
访问如下地址:
http://localhost:8081/#browse/browse:maven-releases
可以看到上传好的构件,如下图:

总结
本文90%是实操部分,强烈建议大家去操作一遍,加深理解。如果有收获的帮忙分享一下,你们的支持也是我不断输出的一个动力,希望大家都能够学到东西!
相关文章:
Maven系列第5篇:私服详解
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第5篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 环境 maven3.6.1 …...
深入解析Spring Cloud Gateway的GlobalFilter
文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…...
ffmpeg的重采样计算
最近在看ffmpeg的重采样计算逻辑,有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); ,各种请教之后,记录如下。 重采样后的总样本数 为什么要涵盖重采…...
Go HTTP 调用(上)
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出&am…...
STM32Cube高效开发教程<基础篇>(一)----概述
声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 STM32系列…...
汽车RNC主动降噪算法DSP C程序实现
汽车RNC主动降噪算法C程序 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,车载...
Java21虚拟线程完整用法
方式1 Thread.startVirtualThread(new Task());方式2 Thread virtualThread Thread.ofVirtual().name("Virtual Thread").unstarted(new Task()); virtualThread.start();方式3 Thread.ofVirtual().name("Virtual Thread").start(new Task());方式4 Th…...
Vue 中的 nextTick 方法
nextTick的背景 Vue 使用虚拟 DOM(Virtual DOM)和异步更新策略来实现高效的视图更新。当你修改 Vue 实例的数据时,Vue 并不会立即更新真实的 DOM,而是将更新操作加入到队列中,在下一个事件循环周期(微任务…...
TypeScript React(上)
目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS,肯定数据符合结构 泛型、<大写字母> 扩展学习…...
Linux 安全 - LSM源码分析
文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…...
第一次汇报相关问题
深度学习现在已经学习到了Mini-Batch,early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向:云计算和嵌入式 云计算:分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…...
[产品体验] GPT4识图功能
[产品体验] GPT4识图功能 图片配文字超强的OCR能力知识问答多图解释 打开chatgpt的时候突然发现能用识图了,赶紧去体验一下,大大的震撼… 图片配文字 超强的OCR能力 我传上去的图片并不清晰… 还能准确识别,orz ! 知识问答 多…...
《3D 数学基础》几何检测-最近点
目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点,也就是q在直线上的投影。 其中p是直线上的点(向量表示),n是直线的法向量&#x…...
动态规划 -背包问题-详解
问题 注:大佬对此类问题的解法:动态规划背包问题总结 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1ÿ…...
Bootstrap-- 媒体特性
最大、最小宽度例子: 横屏与竖屏例子: 宽度比与像素比例子:...
c# 用非递归的写法实现递归
最近写代码碰到了一个bug,就是递归次数太多爆堆栈了,然后就写了一个递归工具来解决这个问题。 using System; using System.Collections.Generic;/// <summary> /// 递归工具 /// </summary> public static class RecursionTool {//递归方式…...
nginx之location的优先级和nginx的重定向
一、nginx之location的优先级和匹配方式(重点) (一)nginx的正则表达式 nginx的正则表达式 符号 含义 ^ 字符串的起始位置(以什么开头) $ 字符串的结束位置(以什么结尾) * 匹…...
【计算机网络】——前言计算机网络发展的历程概述
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法:算法专栏 C头…...
eventfd
1. #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); //创建eventfd 参数含义: initval:创建eventfd时它所对应的64位计数器的初始值; flags:eventfd文件描述符的标志,可由三种选项组…...
BES耳机空间音频技术实现
BES耳机空间音频技术实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务 音响和耳机在空间音频技术上实现方式是不同的 虚拟现实可谓是空间音频技术最具代表性的应 用领域。虽然虚拟现实的起源可以追溯到1 9 6 8年, …...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
