主要学习记录Maven仓库相关知识,如何借助上传项目jar包到GitHub、Nexus Sonatype,,以及搭建自己的Nexus Sonatype私服,然后在Maven项目的pom文件引入使用,参考Maven官网文档:https://central.sonatype.org/publish/publish-maven/
需要了解:Maven中央仓库并不支持直接发布jar 包,需要将jar 包发布到一些指定的第三方Maven仓库,然后该仓库再将jar 包同步到Maven中央仓库,Sonatype便是Maven中央仓库指定的暂存库。
参考:https://juejin.cn/post/6979850007692181535,https://developer.aliyun.com/article/924317
1、首先本地创建文件夹用于本地仓库,待会需要推送到远程GitHub仓库,如我的D:\mysoftware_notinstall\maven-3.9\github-maven-repository,然后在该文件下可以添加说明文件README.md,并创建repository文件夹,以后发布的jar需要整到该文件夹,然后传到远程仓库。
2、新建远程仓库,比如我的仓库地址是:https://github.com/sichaolong/maven-repository,然后创建 发行分支release、快照分支snapshot,方便jar包版本管理,最后将本地的maven-repository推送到远程仓库github-maven-repository。
3、执行deploy脚本发布包,为了方便直接封装一个脚本,将该脚本复制到待发布的项目根目录,执行 ./deploy.sh s
即可,其中s表示snapshot,r表示release。
#!/bin/bash
if [ $# != 1 ];then
echo 'deploy argument [snapshot(s for short) | release(r for short) ] needed!'
exit 0
fi
## deploy参数,snapshot 表示快照包,简写为s, release表示正式包,简写为r
arg=$1
# 本地仓库
DEPLOY_PATH=D:\\mysoftware_notinstall\\maven-3.9\\github-maven-repository
CURRENT_PATH=`pwd`
deployFunc(){
br=$1
## 快照包发布
cd $DEPLOY_PATH
## 切换对应分支
git checkout $br
cd $CURRENT_PATH
# 开始deploy, scl可以任意写,后面的地址为本地仓库的reposity文件夹
mvn clean deploy -DaltDeploymentRepository=scl::default::file:D:\\mysoftware_notinstall\\maven-3.9\\github-maven-repository\\repository
# deploy 完成,提交
cd $DEPLOY_PATH
git add .
git commit -m 'deploy'
git push origin $br
# 合并master分支
git checkout master
git merge $br
git add .
git commit -m 'merge'
git push origin master
cd $CURRENT_PATH
}
if [ $arg = 'snapshot' ] || [ $arg = 's' ];then
## 快照包发布
deployFunc snapshot
elif [ $arg = 'release' ] || [ $arg = 'r' ];then
## 正式包发布
deployFunc release
else
echo 'argument should be snapshot(s for short) or release(r for short). like: `sh deploy.sh snapshot` or `sh deploy.sh s`'
fi
sleep 100000
5、测试使用,首先修改maven的settings.xml文件引入GitHub仓库地址,然后在另外一个项目的pom文件引入刚发布的jar包坐标即可。
settings.xml
<profile>
<repositories>
<repository>
<id>sichaolong-maven-repo-snapid>
<url>https://github.com/sichaolong/maven-repository/snap/repositoryurl>
repository>
<repository>
<id>sichaolong-maven-repo-releaseid>
<url>https://github.com/sichaolong/maven-repository/release/repositoryurl>
repository>
repositories>
profile>
pom.xml
<dependency>
<groupId>sclgroupId>
<artifactId>github-maven-demoartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
其实和上面GitHub的当作maven仓库原理一样,只不过GitHub是免费的公共仓库,而sonatype是一个第三方的仓库。
为什么需要Nexus Sonatype:Maven中央仓库并不支持直接发布jar包。我们需要将jar包发布到一些指定的第三方Maven仓库,然后该仓库再将jar包同步到Maven中央仓库。其中,最”简单”的方式是通过Sonatype OSSRH仓库来发布jar包。接下来,我会介绍如何将jar包发布到Sonatype OSSRH。
注册以及登录地址:https://issues.sonatype.org/login.jsp,登录之后需要提交一个issue
然后按照下图选择
主要是几个地方要注意:
问题名称,只要大概表达清楚意思即可
groupId要写准确
Porject URL填写Github仓库地址
SCM url需要在Github仓库地址后带git后缀
提交后,我本来以为是人工审核,其实是全自动机器人自动回复你。它要求你证明你对groupId的网址有 所有权,比如我填写的是cn.monitor4all,那么我就要在monitor4all.cn的网站上,添加一个TXT解析,指向这个Issue(值写为OSSRH-xxxxx).
如果你是的groupId填写的是com.github.xxx,则不需要做上述的步骤。所以如果自己没有域名,或者嫌麻烦的,直接用com.github.xxx即可。
我的填写参考,这里并没使用刚才创建的仓库,而是使用一个[email protected]:sichaolong/simple-log-solution-scl.git
,后续改动
更新:需要使用io.github.xxx,上图填写的groupid错误,注意更新完别忘记Open issue
然后等待即可
除了ApacheMaven安装之外,您还必须安装GPG客户端 和Maven GPG插件要求的命令行路径。更多 信息请参阅
http://www.gnupg.org/as 以及插件文档和下面。
GPG是Maven的一个工具插件,GPG是一种RSA算法的实现。主要作用是鉴权用的,sonatype既然允许你上传到公有仓库,肯定要鉴权。防止其他恶意的人上传Jar包。
我们去官网下载Windows 可视化 GunPG:https://www.gnupg.org/download/ 或者 https://gpg4win.org/get-gpg4win.html 下载安装之后生成证书,然后看到
点击在服务器发布,然后等待即可,然后就是配置Maven的settings.xml
<profiles>
<profile>
<id>ossrhid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<gpg.executable>你的gpg的可执行pathgpg.executable>
<gpg.passphrase>你的passphrase,可以在可视化界面更改gpg.passphrase>
properties>
profile>
profiles>
<servers>
<server>
<id>ossrhid>
<username>你上面注册的账号username>
<password>你上面注册的密码password>
server>
servers>
settings>
接下来就是配置项目pom.xml,设计打包插件保证项目能发布到sonatype仓库
<distributionManagement>
<snapshotRepository>
<id>ossrhid>
<url>https://s01.oss.sonatype.org/content/repositories/snapshotsurl>
snapshotRepository>
distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.pluginsgroupId>
<artifactId>nexus-staging-maven-pluginartifactId>
<version>1.6.7version>
<extensions>trueextensions>
<configuration>
<serverId>ossrhserverId>
<nexusUrl>https://s01.oss.sonatype.org/nexusUrl>
<autoReleaseAfterClose>trueautoReleaseAfterClose>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.2.1version>
<executions>
<execution>
<id>attach-sourcesid>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-javadoc-pluginartifactId>
<configuration>
<javadocExecutable>${java.home}/bin/javadocjavadocExecutable>
configuration>
<executions>
<execution>
<id>attach-javadocsid>
<goals>
<goal>jargoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-gpg-pluginartifactId>
<version>1.5version>
<executions>
<execution>
<id>sign-artifactsid>
<phase>verifyphase>
<goals>
<goal>signgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
也可以添加一下自己的信息以及LICENES
<licenses>
<license>
<name>The Apache Software License, Version 2.0name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txturl>
<distribution>actabledistribution>
license>
licenses>
<developers>
<developer>
<name>sichaolongname>
<email>[email protected]email>
<organization>io.github.sichaolongorganization>
developer>
developers>
<scm>
<tag>mastertag>
<url>[email protected]:sichaolong/simple-log-solution-scl.giturl>
<connection>[email protected]:sichaolong/simple-log-solution-scl.gitconnection>
<developerConnection>[email protected]:sichaolong/simple-log-solution-scl.gitdeveloperConnection>
scm>
最后就是正式打包发布,执行 mvn clean deploy
,等待发布上传完成即可
ps:需要注意的问题是groupId需要和上面申请的sonatype的保持一致
根据坐标访问sonatype仓库查看结果,位置在上文pom文件配置的路径,比如我的https://s01.oss.sonatype.org/content/repositories/snapshots/io/github/sichaolong/
测试使用,在另外一个项目pom导入坐标
<dependency>
<groupId>io.github.sichaolonggroupId>
<artifactId>nexus-sonatype-maven-demoartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
如果不想使用上面的方式,而是使用公司内网或者是局域网搭建一个仓库,小范围使用,可以使用Nexus Sonatype搭建自己的maven私服。
Maven 私服的概念就是在本地架设一个 Maven 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(artifact)时,如果本地仓库没有,再去私服下载,私服没有,再去中央仓库下载。这样做会有如下一些优点:
减少网络带宽流量
加速 Maven 构建
部署第三方构件
提高稳定性、增强控制
降低中央仓库的负载
参考:https://www.hangge.com/blog/cache/detail_2844.html,https://juejin.cn/post/6844903991600480269
1、访问官网下载Nexus,地址:https://help.sonatype.com/repomanager3/product-information/download,我这里选择Windows 3.x版本的zip包。
解压后会得到两个文件夹:nexus-3.56.0-01(nexus 服务目录)、sonatype-work(私有库目录)
2、配置私服,其中 etc/nexus-default.properties 文件配置端口(默认为 8081)和 work 目录信息,我们可以按需修改。
3、启动登录,Nexus 服务启动以后,我们使用浏览器访问 http://IP:8081/。
4、使用, 下面是一些概念说明,之后就可以测试使用了。
(1)默认仓库说明:
maven-central:maven 中央库,默认从 https://repo1.maven.org/maven2/ 拉取 jar
maven-releases:私库发行版 jar,初次安装请将 Deployment policy 设置为 Allow redeploy
maven-snapshots:私库快照(调试版本)jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 或项目 pom.xml 中使用
(2)仓库类型说明:
group:这是一个仓库聚合的概念,用户仓库地址选择 Group 的地址,即可访问 Group 中配置的,用于方便开发人员自己设定的仓库。maven-public 就是一个 Group 类型的仓库,内部设置了多个仓库,访问顺序取决于配置顺序,3.x 默认为 Releases、Snapshots、Central,当然你也可以自己设置。
hosted:私有仓库,内部项目的发布仓库,专门用来存储我们自己生成的 jar 文件
snapshots:本地项目的快照仓库
releases: 本地项目发布的正式版本
proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下 Remote Storage 属性的值即被代理的远程仓库的路径),如可配置阿里云 maven 仓库
central:中央仓库