乐趣区

关于云计算:我把自己的java库发布到了maven中央仓库从此可以像JacksonSpring的jar一样使用它了

欢送拜访我的 GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,波及 Java、Docker、Kubernetes、DevOPS 等;

对于 maven 地方仓库

  • 作为一个 java 程序员,对 maven 地方仓库 <font color=”blue”>https://mvnrepository.com/</font> 天然是十分相熟的,毕竟咱们的利用依赖的 jar 大部分都来自此处,如果您想把本人开发的 java 库也托管在下面,让大家像应用 Jackson、Spring 那样轻松简略的应用您的 jar,就请随本文一起操作吧;
  • 先看看成果,下图是我公布的 java 库在地方仓库的搜寻后果:

前提条件

  • 因为 sonatype 官网会要求您在 github 创立一个仓库(仓库名由 sonatype 官网指定,以此验证您是否有 github 操作权限),因而请确保您本人有 github 账号,并且能够创立仓库

本篇概览

  • 梳理一下,依照以下步骤将本人的 java 库公布到 maven 地方仓库:

  • 文末还会对已经踩过的小坑做了总结,心愿能帮忙读者们提前避开
  • 看起来略有些繁琐,但其实很简略,接下来开始吧

筹备工作

  • 首先请把您的 java 工程筹备好,我用的是一个十分一般的 maven 工程,名为 <font color=”red”>opencv-linux</font>,github 仓库地址 <font color=”blue”>https://github.com/zq2599/ope…</font>
  • 本次波及的软件信息如下:
  • 操作系统:macOS Monterey(12.0.1)
  • JDK:1.8.0_312
  • Maven:3.8.3

1. 注册帐号

  • 关上网站 https://issues.sonatype.org,注册一个帐号,登录后成果如下图:

2. 创立问题 (issue)

  • 点击上图红框中的 <font color=”red”> 新建 </font> 开始创立 issue,如下图,项目选择 <font color=”blue”>Community Support</font>,问题类型是 <font color=”blue”>New Project</font>:

  • 接下来填写我的项目相干的信息,请留神 <font color=”blue”>Project URL</font> 外面是您本人的工程对应的 github 仓库地址:

  • 提交后期待几分钟,注册账号时填写的邮箱会收到一封邮件,要求你创立一个仓库,以此来证实之前提交的 github 帐号属于你本人:

  • 上述内容在方才新建的 issue 页面也能看到,如下图,即 sonatype 的评论:

3. 创立 sonatype 指定的仓库

  • 登录您的 github,依照要求创立仓库,我这里要创立的是 <font color=”blue”>https://github.com/zq2599/OSS…</font>
  • 老老实实的创立进去就行了:

4. 在 issue 上进行回复

  • 关上 issuse,减少一个评论,如下图:

  • 不久后(我这边是十多分钟),就会收到一条新的评论,告诉你能够去做公布了,并给你了 snapshot 和 release 的公布地址:

5. 装置 GPG

  • 前面的操作中,在将 jar 公布到地方仓库时,要用 GPG 工具对上传的数据进行签名,因而接下来要筹备好 GPG 秘钥
  • 先装置 GPG 软件,关上网站:https://www.gnupg.org/download/
  • 下载安装文件,请抉择适宜您的操作系统的,我的抉择如下图红框:

  • 装置 GPG

6. 生成秘钥并上传

  • 装置实现后,在控制台执行 <font color=”blue”>gpg2 –gen-key</font> 开始创立秘钥
  • 依据提醒输出账号、邮箱、明码等:
GnuPG needs to construct a user ID to identify your key.

Real name: zq2599
Email address: zq2599@gmail.com
You selected this USER-ID:
    "zq2599 <zq2599@gmail.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
  • 操作实现后失去如下信息:
gpg: key 11027EJIHGFEDCBA marked as ultimately trusted
gpg: directory '/Users/will/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/will/.gnupg/openpgp-revocs.d/561AEE4EA92EE3E4C389941811027E9876543210.rev'
public and secret key created and signed.

pub   rsa3072 2021-11-10 [SC] [expires: 2023-11-10]
      561AEE4EA92EE3E4C389941811027E9876543210
uid                      zq2599 <zq2599@gmail.com>
sub   rsa3072 2021-11-10 [E] [expires: 2023-11-10]
  • 如上所示,失去了 pub key 等于 <font color=”red”>561AEE4EA92EE3E4C389941811027E9876543210</font>
  • 执行以下命令,将秘钥同步到云端,留神 keyserver,网上能够搜到很多个,集体实际操作中,上面这个是能够胜利的:
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 561AEE4EA92EE3E4C389941811027E9876543210

7. maven 全局配置

  • 试想把 sonatype 的账号密码写在我的项目的 pom.xml 中,再上传到 github 让所有人都看到?置信您肯定不违心这样,所以还是放在 maven 的全局配置中比拟平安,毕竟是保留在本人的电脑上
  • 关上 maven 的配置文件 <font color=”red”>settings.xml</font>,在 servers 上面减少一个 server 节点,这是个账号密码的配置,对应的是 <font color=”blue”>https://issues.sonatype.org</font> 的账号密码:
<server>
    <id>ossrh</id>
    <username>zq2599</username>
    <password>12345678</password>
</server>
  • 在 <font color=”blue”>profiles</font> 下减少一个 <font color=”red”>profile</font> 节点,<font color=”blue”>gpg.passphrase</font> 的内容是方才创立 gpg 秘钥时输出的明码:
<profile>
    <id>gpg</id>
    <properties>
    <!-- 因为我的电脑装的 gpg2,所以须要指定执行 gpg2,否则会报错 -->
    <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>abcdefgh</gpg.passphrase>
    </properties>
</profile>
  • 波及到账号密码的全局配置就实现了,接下来关上您的 java 工程,咱们去批改 pom.xml 的配置

8. maven 我的项目配置

  • 首先要搞清楚公布仓库的地址在哪,官网领导如下,给出了 snapshot 和 release 的仓库地址:

  • 以下是 java 工程的 pom.xml 文件,需重点关注的中央都有中文正文,<font color=”red”> 请不要漏掉带序号的正文 </font>,这些都是最要害的配置,这种正文共 11 个:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>io.github.zq2599</groupId>
    <artifactId>opencv-linux</artifactId>
    <version>0.0.3</version>
    <name>opencv-linux</name>
    <description>opencv-linux</description>
    <!-- 1. url 必须要有,不然近程提交时会返回谬误 -->
    <url>https://github.com/zq2599/opencv-client</url>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <packaging>jar</packaging>

    <!-- 2. 开源证书 -->
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <!-- 3. 源码仓库信息 -->
    <scm>
        <connection>scm:git:git@github.com:zq2599/opencv-client.git</connection>
        <developerConnection>scm:git:git@github.com:zq2599/opencv-client.git</developerConnection>
        <url>https://github.com/zq2599/opencv-client/tree/main</url>
    </scm>
    <!-- 4. 开发人员信息 -->
    <developers>
        <developer>
            <name>zq2599</name>
            <email>zq2599@gmail.com</email>
            <organization>https://github.com/zq2599</organization>
            <timezone>+8</timezone>
        </developer>
    </developers>
    <!-- 5. 上传的仓库地址,以及应用哪个账号密码配置 -->
    <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>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
    </dependencies>

    <build>
        <!-- 配置好每个插件的属性 -->
        <pluginManagement>
            <plugins>
                <!-- 6. 上传到 sonatype 的插件 -->
                <plugin>
                    <groupId>org.sonatype.plugins</groupId>
                    <artifactId>nexus-staging-maven-plugin</artifactId>
                    <version>1.6.7</version>
                    <extensions>true</extensions>
                    <configuration>
                        <!-- 这里的 id 必须要和全局配置中的 server 统一 -->
                        <serverId>ossrh</serverId>
                        <!-- 这个地址,肯定要和 issue 的评论中给出的地址统一!-->
                        <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                        <!-- 如果心愿公布后主动执行 close 和 release 操作,此处能够调整为 true -->
                        <autoReleaseAfterClose>false</autoReleaseAfterClose>
                    </configuration>
                </plugin>

                <!-- 7. 上传源码的插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>3.1.0</version>
                    <inherited>true</inherited>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <excludeResources>true</excludeResources>
                        <useDefaultExcludes>true</useDefaultExcludes>
                    </configuration>
                </plugin>

                <!-- 8. 生成 doc 文档的插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>3.0.0</version>
                    <inherited>true</inherited>
                    <executions>
                        <execution>
                            <id>bundle-sources</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <maxmemory>1024</maxmemory>
                        <encoding>UTF-8</encoding>
                        <show>protected</show>
                        <notree>true</notree>

                        <!-- Avoid running into Java 8's very restrictive doclint issues -->
                        <failOnError>false</failOnError>
                        <doclint>none</doclint>
                    </configuration>
                </plugin>

                <!-- 9. 编译构建 maven 工程的插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <!-- 10. 确定要应用哪些插件 -->
        <plugins>
            <plugin>
                <groupId>org.sonatype.plugins</groupId>
                <artifactId>nexus-staging-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- 11. 生成签名,确定应用那个 gpg 秘钥 -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.5</version>
                        <executions>
                            <execution>
                                <!-- 必须和配置中的 gpg 校验 id 统一 -->
                                <id>gpg</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

9. 编译、构建、上传

  • 编译构建上传其实很简略,上面一行命令搞定 (进入 pom.xml 所在目录下执行以下命令):
mvn clean javadoc:jar deploy -P release
  • 构建期间会弹出窗口让你输出明码,请输出创立 GPG 秘钥时设置的明码:

  • 构建和上传胜利后,控制台输入如下(截选):
...
[INFO] Installing /Users/zhaoqin/github/blog_demos/opencv-linux/target/opencv-linux-0.0.3-sources.jar.asc to /Users/zhaoqin/github/blog_demos/opencv-linux/target/nexus-staging/staging/543da2cd9af848/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc
[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "543da2cd9abc12"
[INFO]  * Created staging repository with ID "iogithubzq2599-1008".
[INFO]  * Staging repository at https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008
[INFO]  * Uploading locally staged artifacts to profile io.github.zq2599
Uploading to ossrh: 
...
https://s01.oss.sonatype.org:443/service/local/staging/deployByRepositoryId/iogithubzq2599-1008/io/github/zq2599/opencv-linux/0.0.3/opencv-linux-0.0.3-sources.jar.asc (659 B at 1.2 kB/s)
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "iogithubzq2599-1008".

Waiting for operation to complete...
...
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  27.199 s
[INFO] Finished at: 2021-11-12T08:08:37+08:00
  • 记住上述信息中展现的 <font color=”blue”>iogithubzq2599-1008</font>,这是本次上传操作在仓库中对应的 ID

10. 登录指定的仓库网址

  • 接下来登录 Nexus 网站,具体的网址 <font color=”red”> 肯定要看 issue 的评论 </font>,如下图红框,我这里要登录的是:<font color=”blue”>https://s01.oss.sonatype.org</font>

  • 点击下图右上角红框登录,账号密码是在 <font color=”blue”>https://issues.sonatype.org</font> 注册的那个:

11. 公布

  • 登录胜利后,点击下图红框中的 <font color=”blue”>Staging Repositories</font>:

  • 如下图,找到适合的记录(我这里是 <font color=”blue”>iogithubzq2599-1008</font>),点击红框 3 中的 <font color=”blue”>Release</font> 进行公布,如果状态不是 closed,就要开展底部的 Activity 查看产生了什么异样:

  • 操作胜利,如下图所示:

12. issue 收到评论,提醒实现工夫

  • 静候十多分钟,issue 上收到一条评论,提醒同步操作已激活,三十分钟内同步到 https://repo1.maven.org/,四小时内同步到 https://search.maven.org:

  • 网上有文章提到第一次公布要在 issuse 上评论,才会触发同步操作,我这里没有遇到(正打算评论呢,发现曾经开始同步了)

13. 三十分钟内同步到 https://repo1.maven.org

  • 静候三十分钟,能够在网站 https://repo1.maven.org 上看到上传的工程相干文件了,如下图:

14. 四小时内同步到 https://search.maven.org

  • 静候四小时,能够在网站 https://search.maven.org 上看到上传的工程相干文件了,如下图:

15. 二十四小时内同步到 https://mvnrepository.com/

  • 同步到 https://mvnrepository.com 的工夫并不是准确的二十四小时,而是我时隔二十四左右在此网站上能够搜寻到本人的库:

  • 至此,本人的 java 库已胜利公布到 maven 地方仓库,能够像 Jackson、Spring 库那样应用这个库了,用法就是增加这个依赖:
<dependency>
    <groupId>io.github.zq2599</groupId>
    <artifactId>opencv-linux</artifactId>
    <version>0.0.3</version>
</dependency>

踩坑记录

  • 当初已实现了所有的操作,回顾一下,整个过程其实绝对比较顺利,只遇到了三个小坑须要您留神:
  • 同步 gpg 秘钥到云端的时候,网上有文章提到用 <font color=”red”>hkp://subkeys.pgp.net</font>,我在应用该地址的时候始终在报错,改为 <font color=”blue”>hkp://keyserver.ubuntu.com:11371</font> 之后上传胜利
  • maven 工程的 pom.xml 文件中,肯定要有 url 节点,如下图,否则会在同步到云端的时候报错 <font color=”blue”>Project url missing</font>

  1. 公布的操作是在网页上进行的,网上有的文章提到网站是 <font color=”blue”>https://oss.sonatype.org</font>,最后我也关上了该网页并尝试登录,惋惜始终登录失败,最终,在 issue 的评论上发现如下图红框,要登录的网站是 <font color=”blue”>https://s01.oss.sonatype.org</font>

  • 至此,所有操作都已实现,如果您正在将本人的 java 库公布到 maven 地方仓库,心愿本文能给您一些参考

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游 Java 世界 …
https://github.com/zq2599/blog_demos

退出移动版