首页 > 其他分享 >一篇搞定发布自己的类库到Maven中央仓库

一篇搞定发布自己的类库到Maven中央仓库

时间:2023-12-12 16:36:38浏览次数:33  
标签:类库 maven 搞定 gpg Maven https org com

在Maven项目中,90%以上的jar包是通过pom文件直接从开源仓库中获取依赖jar包文件,然后在项目中进行集成使用。
此时如果你有一个开源项目,那么如何将该开源项目发布到Maven中央仓库,让其他人可以方便的使用,而不是先下载jar,然后install的本地?
本文将通过一步步的操作带领大家讲自己的开源项目发布到Maven中央仓库(Maven Central Repository)中,https://mvnrepository.com/。
Maven中央仓库并不支持直接发布jar包,需要将jar包发布到一些指定的第三方Maven仓库,然后该仓库再将jar包同步到Maven中央仓库,Sonatype便是这样的角色

准备工作

  1. 注册Github账户,在申请的时候需要用到GroupId,这边如果没有自己的网站及域名建议注册Github。

  2. 注册Sonatype账户,注册地址:sonatype sign up

    1. Username和Password作为登录的账号密码
    2. 密码有强度要求
    3. Email用于后续关联的通知,务必使用真实地址

项目发布申请

  1. 点击导航栏的"新建"进行项目发布申请创建。
    image

    通过在JIRA上创建issue来申请发布新的jar包,Sonatype的工作人员会进行审核,一般按照要求填写不会有问题。

    注意:

    1. Group Id:如果有域名可以填写自己的域名,如果没有可以使用GithubGiteeGitlib等地址例如:io.github.you_account,此处注意必须是 io
    2. Project UrlSCM Url建议都采用Git地址,其中SCM的地址需要带.git
    3. Already Synced to Central选择No
  2. 提交后等待一小段时间再来查看刚提交的问题。你会收到类似下图的回复。此时会要求进行Group Id的所有权验证。

    image

    如果填写的是Github则会要求创建一个指定的仓库,创建一个即可。

    如果填写的是自己的自己的域名则会要求创建个指定文件到此域名下。

  3. 填写按要求完成后修改状态为开放状态 。点击Wait for Reponse在弹出的状态列表中选择 开放
    image

    如果按要求完成了所有的操作等待一段时间后一般就自动通过了。这时会给予推送服务器的地址,后续所有的相关地址都需要用到。
    image

    到此发布申请也就完成了。

安装GPG

发布到Maven仓库中的所有文件都要使用GPG签名,以保障完整性。因此,我们需要在本地安装并配置GPG。

  1. 进入gnupg下载,https://www.gnupg.org/download/index.html

  2. 根据操作系统下载不同的版本并进行安装。

    此处以Windows为例:

    建议下载2个安装包分别为

    1. Gpg4win:Full featured Windows version of GnuPG

      此工具通过Windows窗口进行密钥的管理。

    2. download sig:Simple installer for GnuPG 1.4

      此工具用于后续Maven发布使用

  3. 创建密钥

    1. Gpg4win

      生成秘钥,按步步骤提示进行操作
      必须勾选密码
      image
      按提示输入密码
      image

      秘钥生成好后,右键选择密钥,需要你把公钥上传到公共服务器供sonatype验证。
      image

    2. 命令行

      生成秘钥,按步骤提示进行操作

      gpg --generate-key
      
      # 生成结果
      gpg (GnuPG/MacGPG2) 2.2.32; Copyright (C) 2021 Free Software Foundation, Inc.
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.
      注意:使用 “gpg --full-generate-key” 以获得一个全功能的密钥生成对话框。
      GnuPG 需要构建用户标识以辨认您的密钥。
      真实姓名: xxxxxxx
      电子邮件地址: [email protected]
      您选定了此用户标识:
          “xxxxxxxx <[email protected]>”
      更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? u
      更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
      我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
      、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
      发生器有更好的机会获得足够的熵。
      我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
      、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
      发生器有更好的机会获得足够的熵。
      gpg: 密钥 54EC3C8FA3A5B50F 被标记为绝对信任
      gpg: 目录‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d’已创建
      gpg: 吊销证书已被存储为‘/Users/xxxxxxxxx/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxxxxxxxxxxxxxxx.rev’
      公钥和私钥已经生成并被签名。
      pub   rsa3072 2021-12-06 [SC] [有效至:2023-12-06]
            8BDxxxxxxxxxxxxxxxxxxxxxxxxxxxxB50F
      uid                      xxxxxxxx <[email protected]>
      sub   rsa3072 2021-12-06 [E] [有效至:2023-12-06]
      

      秘钥生成好后,需要你把公钥上传到公共服务器供sonatype验证。

      官网教程里有三个地址可以用:

      • keyserver.ubuntu.com
      • keys.openpgp.org
      • pgp.mit.edu
      ➜  ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50F
      gpg: 正在发送密钥 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371
      gpg: 发送至公钥服务器失败:文件结尾
      gpg: 发送至公钥服务器失败:文件结尾
      ➜  ~ gpg --keyserver keyserver.ubuntu.com --send-keys 8BD96B0EA18E5162B94EA7F754EC3C8FA3A5B50F
      gpg: 正在发送密钥 54EC3C8FA3A5B50F 到 hkp://keyserver.ubuntu.com
      gpg: 发送至公钥服务器失败:Network is unreachable
      gpg: 发送至公钥服务器失败:Network is unreachable
      ➜  ~ gpg --keyserver pgp.mit.edu:11371 --send-keys 54EC3C8FA3A5B50F
      gpg: 正在发送密钥 54EC3C8FA3A5B50F 到 pgp.mit.edu:11371
      gpg: 发送至公钥服务器失败:文件结尾
      gpg: 发送至公钥服务器失败:文件结尾
      

配置setting.xml

setting.xml为Maven的全局配置文件,一般路径为$MAVEN_HOME/conf/settings.xml

找到Services节点进行如下配置

<servers>
    <server>
        <id>ossrh</id>
        <username>你的Sonatype账号</username>
        <password>你的Sonatype密码</password>
    </server>
</servers>

找到profiles节点进行如下配置,gpg.executable节点建议配置第二个安装包安装的gpg路径,这一步一定要做不然容易发布的时候提示找不到gpg。

<profiles>
      <profile>
          <id>ossrh</id>
          <activation>
              <activeByDefault>true</activeByDefault>
          </activation>
          <properties>
              <gpg.executable>"D:\Program Files (x86)\GnuPG\bin\gpg.exe"</gpg.executable>
              <gpg.passphrase>你的密钥创建时候的密码</gpg.passphrase>
          </properties>
      </profile>
</profiles>

配置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>

    <!--Maven相关信息配置-->
    <name>fluent-validation</name>
    <url>https://github.com/yikuaibaiban/fluent-validation</url>
    <description>fluent-validation is a streaming validation framework.</description>
    <!--Issue 配置-->
    <issueManagement>
        <system>Github Issue</system>
        <url>https://github.com/yikuaibaiban/fluent-validation/issues</url>
    </issueManagement>
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>https://apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>
    <!--开发人员信息配置-->
    <developers>
        <developer>
            <name>yikuaibaiban</name>
            <email>[email protected]</email>
            <timezone>+8</timezone>
        </developer>
    </developers>
    <!--scm信息配置-->
    <scm>
        <url>https://github.com/yikuaibaiban/fluent-validation</url>
        <connection>scm:https://github.com/yikuaibaiban/fluent-validation.git</connection>
        <developerConnection>scm:git:https://github.com/yikuaibaiban/fluent-validation.git</developerConnection>
    </scm>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <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>
                    <!-- Javadoc -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>3.5.0</version>
                        <configuration>
                            <windowtitle>${project.name}</windowtitle>
                            <doctitle>${project.name}</doctitle>
                            <show>private</show>
                            <detectLinks>false</detectLinks>
                            <detectOfflineLinks>true</detectOfflineLinks>
                            <linksource>true</linksource>
                            <detectJavaApiLink>true</detectJavaApiLink>
                            <source>8</source>
                        </configuration>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- 以下是GPG -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>ossrh</id>
                    <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>ossrh</id>
                    <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>
</project>

发布到Maven中央仓库

推送代码

  1. 使用命令行发布 mvn clean deploy -P release
  2. 使用Idea发布
    image

后续操作(必须要操作)

此时进入https://s01.oss.sonatype.org并登录(登录的账号密码与刚开始注册的账号密码一致)查看发布好的构件,点击左侧的Staging Repositories。

此时需注意,如果项目中版本信息为1.0.0-SNAPSHOT,即SNAPSHOT为后缀,则发布的项目位于Snapshots目录下。在左上角的Artifact Search中能够搜到。

如果是Release后缀,则可直接在Staging Repositories中看到(有可能要稍等一下,等待平台处理)。
选中对于的repository之后,点击的close,close时会检查发布的构件是否符合要求。若符合要求,则close成功,成功之后点击箭头所指的release,即可正式将jar包发布到Sonatype OSSRH仓库。
image

当点击Release之后,邮件中会收到Issues变化的信息,提示同步已经被激活,正常10分钟就可以更新同步。

release成功大概2个小时之后,该构件就会同步到Maven中央仓库,届时会有邮件通知。

实践过程中发现十分钟之内已经成功同步到https://repo1.maven.org/的中央仓库当中。

逐步的其他Maven仓库,包括阿里镜像都会进行同步。

标签:类库,maven,搞定,gpg,Maven,https,org,com
From: https://www.cnblogs.com/ykbb/p/17897143.html

相关文章

  • 发布jar包到maven中央仓库
    1.环境在网上找的很多文章中写得都有很多问题,这里记录一下最近一次成功地发布jar包到maven中央仓库的过程。并附带上每一个步骤官方的指导链接。系统:mac(windows系统在下载辅助工具时不太一样,在配置上和mac系统没有区别)IDE:IntelliJIDEAJDK:1.8maven:3.8.1(IDEA自带的版本)代......
  • docker-compose一步帮你搞定n个容器
    ‍#一、docker-compose简介docker-compose是docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。为什么需要docker-compose?一般我们一个完整的应用部署包括几个服务:Web应用、MySQL服务、Redis服务,有的可能用到Kafka服务、Prometheus服务等等。那么如何管理这么......
  • C#开源克隆类库DeepCloner的功能、优点与妙用
    在开发过程中有时候我们需要对现有对象进行克隆,我们可以使用DeepCloner类库来完成这个需求功能。DeepCloner类库功能:深度克隆: DeepCloner提供深度克隆对象的能力,递归地克隆对象图中的所有引用类型属性。循环引用处理: 能够处理对象图中的循环引用,防止无限递归。自定义克......
  • Visual Studio 2022 搞定
    第一次装这个是好久好久以前,好怀念哪个时候。。。。没什么条条框框的限制,需要啥就去电脑城买个碟就行,4块钱。今天折腾半天,终于搞定。留个记号吧。附带了专业版激活密钥,激活后即可永久免费使用,喜欢的小伙伴千万不要错过哦。(从这里低调的拿走,https://kdocs.cn/l/cixbRhgzh1pv)VisualS......
  • maven 配置(cmd 黑窗口执行 mvn 时默认的 settings 文件和 idea maven 相关配置)
    写在前面:本文章用于记录博主平时遇到的问题,步骤略粗糙,目的在于记录一边后续博主自己查找,如果能帮助到其他人更好。文章中用到的链接均为自行引入,侵删,谢谢(2I2Rc*@JY8)问题说明:在一次使用cmdmvn命令通过下载到本地的第三方jar包(ojdbc8.jar)创建本地maven仓库的文件结构时发现......
  • maven访问仓库的顺序
    repository仓库配置文件有3个地方:1、默认中央仓库:Maven安装目录下lib/maven-model-builder-${version}.jar中\org\apache\maven\model\pom-4.0.0.xml文件配置着默认中央仓库,它是所有MavenPOM的父POM,所有Maven项目继承该配。<repositories><repository><id>centr......
  • 4点搞定Type-C接口的PCB可制造性设计优化!
    Type-C接口逐渐显现出成为未来主流接口的趋势,连一贯坚持用lighting接口的苹果手机也转向使用Type-C接口。Type-C接口具有支持正反插、体积更小、传输速度更快、支持更大的功率传输等优点,因此广泛应用于各种电子设备,包括智能手机,笔记本电脑,平板电脑等。今天我们研究研究如何卓越打......
  • Java开发者必备:Maven简介及使用方法详解!
    今天我们来介绍一个在Java开发中非常重要的工具——Maven。如果你是一名Java开发者,那么你一定不会对Maven感到陌生。但是,对于一些新手来说,可能还不太了解Maven是什么,它有什么作用,以及如何使用它。接下来,就让我们一起来深入了解一下Maven吧!一、maven简介Maven是什么Maven是一个......
  • Maven 环境变量配置 'mvn' 不是内部或外部命令,也不是可运行的程序或批处理文件
    在cmd里面输入对应的mvn命令出现了这行提示,说明你的maven环境变量配置有问题,需要重新配置1、添加M2_HOME和MAVEN_HOME在系统变量里面添加M2_HOME和MAVEN_HOME,都指向你的本地maven安装路径 2、添加用户变量PATH中3、校验在cmd中输入mvn-version出现你对应的maven......
  • Maven无法下载fastdfs-client-java依赖问题解决
    一、分析原因控制台报错具体如下:并且pom.xml中以下依赖爆红:<dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version></dependency>原因:因为fastdfs-clien......