欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gpg加密发布jar包到maven*仓库详细过程以及踩的坑

程序员文章站 2022-05-25 09:40:32
...

最近为了提升逼格,当然主要是为了便于之后使用,我尝试将自己写的jar包发布到maven*仓库,历时一个月的摸爬滚打,最终成功发布!!!
现在我把发布的详细过程以及踩到的坑分享一下,与君共勉!

1.注册sonatype并提交issue工单

maven*仓库是由sonatype提供的免费维护,要上传jar到maven*仓库就必须注册一个sonatype账号
注册网址:https://issues.sonatype.org/secure/Signup!default.jspa
注册完成后,进入 https://issues.sonatype.org 创建一个issue,如下
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
点击create,创建工单,按实际情况填写工单
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
这里主要是Group Id的填写,使用com.github.xxx是最快的,若使用私有域名会需要认证。
创建完成后,点击【Issues】选择刚刚新建的工单,可以看到状态为Waiting for Response或Open,此时为待审核状态。

2.认证域名

为了高逼格,我没有满足于使用com.github.xxx作为Group Id,而是在腾讯云买了个qinpiyi.com的域名(domain)。提交issue工单后几个小时后收到了一封邮件,内容如下
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
我选择了第一种方式(添加一条TXT记录)来认证我的域名,具体步骤如下:
1.打开腾讯云控制台,进入域名服务—>我的域名—>域名列表,找到要认证的域名,点击“解析”开始解析域名:
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
2.域名解析列表—>记录管理—>添加记录
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
3.主机记录选择 【*】 (泛解析),记录类型选择【TXT】,线路类型选择【*】,记录值输入邮件中提到的JIRA ticket,然后点击保存,这样便完成了一条TXT记录的添加。
gpg加密发布jar包到maven*仓库详细过程以及踩的坑
4.最后一步,我分别用邮件和评论工单(Comment)的方式做了回复,内容如下
I do own the domain qinpiyi.com. I have added a TXT record(OSSRH-46932) to my DNS .
最多几个小时之后,会收到审核通过的邮件,工单状态也变为了【RESOLVED】,即为通过了域名的认证!
gpg加密发布jar包到maven*仓库详细过程以及踩的坑

坑一:我当时添加了TXT记录之后,由于一直没有用Comment或邮件的方式告知对方,导致过了好多天都没能收到认证通过的通知!

3. GPG生成**

  1. 下载安装GPG环境
    下载地址:https://www.gpg4win.org/
  2. 检查是否安装成功
    打开cmd命令行窗口,输入
    gpg --version
    执行后成功输出gpg版本即为安装成功
  3. 生成**
    命令行执行
    gpg --gen-key
    根据提示输入用户名和邮箱以及Passphase,其余信息使用默认即可,Passphase即为密码,需记住,后续上传jar包时要用到
  4. 查看公钥
    执行
    gpg --list-keys
    输出如下信息
    C:\Users\Administrator>gpg --list-keys
    C:/Users/Administrator/AppData/Roaming/gnupg/pubring.kbx
    --------------------------------------------------------
    pub   rsa2048 2019-03-25 [SC]
          23EE7FF80A076D26671731FA69D245B71877DC6A
    uid           [ultimate] qinpiyi <aaa@qq.com>
    sub   rsa2048 2019-03-25 [E]
    
    其中的十六进制串23EE7FF80A076D26671731FA69D245B71877DC6A即为生成的公钥id
  5. 发布公钥
    执行
    gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 23EE7FF80A076D26671731FA69D245B71877DC6A
    将公钥发布到PGP**服务器后,便可以使用本地的私钥来对上传构件进行数字签名,而下载该构件的用户可通过上传的公钥来验证签名,也就是说,大家可以验证这个构件是否由本人上传的,因为有可能该构件被坏人给篡改了。
    6.验证是否发布成功
    执行
    gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 23EE7FF80A076D26671731FA69D245B71877DC6A
    成功输出gpg**信息即为发布成功

4. 制作jar包

这里我选择使用maven来构建jar包

  1. 在maven安装目录的config文件夹下打开setting.xml,如下在servers标签中添加内容

    <servers>
    	<server>
    		<id>sonatype-qinpiyi</id>
    		<username>你的sonatype用户名</username>
    		<password>你的sonatype密码</password>
    	</server>
      </servers>
    

    这里id将在pom中使用,可随意命名。

  2. 在Maven项目的pom.xml中添加licenses、developers、scm、profiles、plugins、distributionManagement等内容,如下是我的pom,大家可以参考

    <?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>
    
        <groupId>com.qinpiyi.common</groupId>
        <artifactId>common-response</artifactId>
        <version>0.0.1</version>
        <url>https://github.com/qinpiyi/common</url>
    
        <name>common-response</name>
        <description>CommonResponse and CommonResponseUtils</description>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <licenses>
            <license>
                <name>The Apache Software License, Version 2.0</name>
                <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            </license>
        </licenses>
    
        <!-- 根据自己实际情况填写 -->
        <developers>
            <developer>
                <name>qinpiyi</name>
                <email>aaa@qq.com</email>
            </developer>
        </developers>
    
        <!-- 与申请issue时填写的SCM保持一致 -->
        <scm>
            <connection>https://github.com/qinpiyi/common.git</connection>
            <developerConnection>https://github.com/qinpiyi/common.git</developerConnection>
            <url>https://github.com/qinpiyi/common</url>
        </scm>
    
        <profiles>
            <profile>
                <!-- 这个id就是打包时的 -P 参数 -->
                <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>
                                    <phase>package</phase>
                                    <goals>
                                        <goal>jar-no-fork</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                        <!-- Javadoc插件 -->
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-javadoc-plugin</artifactId>
                            <version>2.9.1</version>
                            <executions>
                                <execution>
                                    <phase>package</phase>
                                    <goals>
                                        <goal>jar</goal>
                                    </goals>
                                    <!-- -Xdoclint:none 是为了避免生成apidoc的时候检查过于严格而报错-->
                                    <configuration>
                                        <additionalparam>-Xdoclint:none</additionalparam>
                                    </configuration>
                                </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>
    
                <!-- snapshotRepository与repository的id应与setting.xml中添加的server的id一致 -->
                <distributionManagement>
                    <snapshotRepository>
                        <id>sonatype-qinpiyi</id>
                        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                    </snapshotRepository>
                    <repository>
                        <id>sonatype-qinpiyi</id>
                        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                    </repository>
                </distributionManagement>
            </profile>
        </profiles>
        
    	<dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
  3. 构建jar包并上传
    在项目根目录(即pom.xml所在目录 )下命令行执行maven指令
    mvn clean deploy -P release verify '-Dgpg.passphrase=自己的GPG密码'
    -P后的release 需和pom.xml文件中profile的id一致,上传过程中可能还会提示再次输入gpg的passphrase密码,上传速度与jar包大小和网速有关,最多几分钟即可上传成功

坑2:mvn指令执行报错“编码gbk的不可映射字符”,在pom.xml中添加了

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding

成功解决

5. 发布jar包

进入 https://oss.sonatype.org 并使用最开始注册的sonatype账号登录,登录成功后点击左侧的Staging Repositories,在右侧列表中找到并勾选自己刚刚上传的内容,若当前状态为open则点击上方的Close按钮,关闭成功后刷新,再次找到该条记录,勾选并点击上方的Release按钮,则发布完成。
gpg加密发布jar包到maven*仓库详细过程以及踩的坑

坑3:Close失败,刷新后点击下方的Activity可以看到报错信息为缺少jar对应的.asc签名文件
解决方法:手动上传缺少的签名文件,若签名文件全部缺失,可在maven项目根目录下命令行依次执行执行下面三条mvn指令,若部分缺失则按照如下的格式编辑对应的指令
mvn gpg:sign-and-deploy-file '-Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/' '-DrepositoryId=sonatype-qinpiyi' '-DpomFile=target/qpy-common-0.0.1.pom' '-Dfile=target/qpy-common-0.0.1.jar'
mvn gpg:sign-and-deploy-file '-Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/' '-DrepositoryId=sonatype-qinpiyi' '-DpomFile=target/qpy-common-0.0.1.pom' '-Dfile=target/qpy-common-0.0.1-sources.jar' '-Dclassifier=sources'
mvn gpg:sign-and-deploy-file '-Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/' '-DrepositoryId=sonatype-qinpiyi' '-DpomFile=target/qpy-common-0.0.1.pom' '-Dfile=target/qpy-common-0.0.1-javadoc.jar' '-Dclassifier=javadoc'

其中-DrepositoryId为setting.xml中server的id,target文件夹中若无.pom文件,可将根目录下pom.xml文件复制到target文件夹中并重命名为xxx.pom文件

Release完成后,约需要等待两三个小时,在 https://search.maven.orghttps://mvnrepository.com 便可以搜到自己发布的依赖了!!!!

参考文章:

怎样提交本地jar到Maven*仓库(windows)
将 Smart 构件发布到 Maven *仓库
如何把自己的Jar包上传到 maven 官方仓库中,Maven上传图文讲解
Maven:Maven GPG Plugin。