概述

主要学习记录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中央仓库指定的暂存库。

目录

  1. 借助GitHub搭建属于自己的maven仓库
  2. 借助Nexus Sonatype发布jar包到sonatype仓库
    1. 在sonatype提交发布工单(Issue)
    2. 配置gpg秘钥连接sontype仓库,配置pom.xml和setting.xml
    3. 发布执行mvn clean deploy
  3. 借助Nexus Sonatype搭建自己的maven私服

一、借助GitHub搭建属于自己的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-snap</id>
        <url>https://github.com/sichaolong/maven-repository/snap/repository</url>
    </repository>
    <repository>
        <id>sichaolong-maven-repo-release</id>
        <url>https://github.com/sichaolong/maven-repository/release/repository</url>
    </repository>
</repositories>
  </profile>

pom.xml

<!--测试发布在github仓库的jar包-->
        <dependency>
            <groupId>scl</groupId>
            <artifactId>github-maven-demo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

二、借助Nexus Sonatype发布jar包到sonatype仓库

2.1 在Nexus Sonatype注册账号并提交工单

其实和上面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即可。

我的填写参考,这里并没使用刚才创建的仓库,而是使用一个git@github.com:sichaolong/simple-log-solution-scl.git,后续改动

在这里插入图片描述

更新:需要使用io.github.xxx,上图填写的groupid错误,注意更新完别忘记Open issue
在这里插入图片描述
然后等待即可
在这里插入图片描述

2.2 配置GPG密钥连接自己的私服、配置pom.xml和setting.xml

除了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>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>你的gpg的可执行path</gpg.executable>
        <gpg.passphrase>你的passphrase,可以在可视化界面更改</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
  
    <servers>
    <server>
      <id>ossrh</id>
      <username>你上面注册的账号</username>
      <password>你上面注册的密码</password>
    </server>
  </servers>
</settings>

接下来就是配置项目pom.xml,设计打包插件保证项目能发布到sonatype仓库

<distributionManagement>
    <!--  申明打包到sonatype公有仓库  -->
    <snapshotRepository>
        <id>ossrh</id>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.sonatype.plugins</groupId>
            <artifactId>nexus-staging-maven-plugin</artifactId>
            <version>1.6.7</version>
            <extensions>true</extensions>
            <configuration>
                <serverId>ossrh</serverId>
                <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                <autoReleaseAfterClose>true</autoReleaseAfterClose>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
                <javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
            </configuration>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>sign-artifacts</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>sign</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

也可以添加一下自己的信息以及LICENES

<licenses>
  <license>
    <name>The Apache Software License, Version 2.0</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>actable</distribution>
  </license>
</licenses>

<developers>
  <developer>
    <name>sichaolong</name>
    <email>2589165806@qq.com</email>
    <organization>io.github.sichaolong</organization>
  </developer>
</developers>

<scm>
  <tag>master</tag>
  <url>git@github.com:sichaolong/simple-log-solution-scl.git</url>
  <connection>git@github.com:sichaolong/simple-log-solution-scl.git</connection>
  <developerConnection>git@github.com:sichaolong/simple-log-solution-scl.git</developerConnection>
</scm>
2.3 发布到Nexus Sonatype仓库

最后就是正式打包发布,执行 mvn clean deploy,等待发布上传完成即可

ps:需要注意的问题是groupId需要和上面申请的sonatype的保持一致
在这里插入图片描述

根据坐标访问sonatype仓库查看结果,位置在上文pom文件配置的路径,比如我的https://s01.oss.sonatype.org/content/repositories/snapshots/io/github/sichaolong/
在这里插入图片描述

测试使用,在另外一个项目pom导入坐标

 <!-- 测试发布在nexus-sonatype的jar包-->
        <dependency>
            <groupId>io.github.sichaolong</groupId>
            <artifactId>nexus-sonatype-maven-demo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

三、借助Nexus Sonatype搭建自己的maven私服

如果不想使用上面的方式,而是使用公司内网或者是局域网搭建一个仓库,小范围使用,可以使用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/,注意启动需要一管理员权限执行

C:\Windows\System32>d:\mysoftware_notinstall\nexus-3.56.0-01-win64\nexus-3.56.0-01\bin\nexus.exe /install
Installed service 'nexus'.

C:\Windows\System32>d:\mysoftware_notinstall\nexus-3.56.0-01-win64\nexus-3.56.0-01\bin\nexus.exe /start
Starting service 'nexus'.

# 等待一会即可

在这里插入图片描述

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:中央仓库

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐