美文网首页
我把自己的java库发布到了maven中央仓库,从此可以像Jac

我把自己的java库发布到了maven中央仓库,从此可以像Jac

作者: 程序员欣宸 | 来源:发表于2022-01-19 08:48 被阅读0次

    欢迎访问我的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/opencv-client</font>

    • 本次涉及的软件信息如下:

    1. 操作系统:macOS Monterey(12.0.1)
    2. JDK:1.8.0_312
    3. Maven:3.8.3

    1. 注册帐号

    在这里插入图片描述

    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指定的仓库

    在这里插入图片描述

    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>
    在这里插入图片描述 在这里插入图片描述

    11. 发布

    • 登录成功后,点击下图红框中的<font color="blue">Staging Repositories</font>:
    在这里插入图片描述
    • 如下图,找到合适的记录(我这里是<font color="blue">iogithubzq2599-1008</font>),点击红框3中的<font color="blue">Release</font>进行发布,如果状态不是closed,就要展开底部的Activity查看发生了什么异常:
    在这里插入图片描述
    • 操作成功,如下图所示:
    在这里插入图片描述

    12. issue收到评论,提示完成时间

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

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

    • 静候三十分钟,可以在网站https://repo1.maven.org上看到上传的工程相关文件了,如下图:
    在这里插入图片描述

    14. 四小时内同步到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>
    

    踩坑记录

    • 现在已完成了所有的操作,回顾一下,整个过程其实相对比较顺利,只遇到了三个小坑需要您注意:
    1. 同步gpg秘钥到云端的时候,网上有文章提到用<font color="red">hkp://subkeys.pgp.net</font>,我在使用该地址的时候一直在报错,改为<font color="blue">hkp://keyserver.ubuntu.com:11371</font>之后上传成功
    2. 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

    相关文章

      网友评论

          本文标题:我把自己的java库发布到了maven中央仓库,从此可以像Jac

          本文链接:https://www.haomeiwen.com/subject/ujfrhrtx.html