美文网首页程序员
Maven中央仓库jar包发布全流程详解

Maven中央仓库jar包发布全流程详解

作者: dothetrick | 来源:发表于2020-08-26 23:14 被阅读0次

    需要4步

    • 创建sonatype账号,并提交工单
    • 设置gpg
    • maven环境配置
    • deploy

    1.创建sonatype账号,并提交工单

    1.1 打开 https://issues.sonatype.org 注册账号

    • 信息都很简单,Full name随便写个就好

    1.2 创建工单

    • 登陆后点击Create创建工单


    • 然后开始工单信息的填写
      • 其中groupId可以直接使用com.github.xxx,当然pom里面也要和这个对应上


    1.2.1 如何使用个人域名作为groupId
    • 首先要买个和groupId对应的域名
      • 例如本人的项目groupId为com.insistingon.binlogportal
      • 那么对应的域名就是insistingon.com
    • 设置域名的DNS配置给sonatype检测
      • 当使用个人域名提交工单时,工单的comment里面会提示


      • 需要证明这个域名的所有人,有两种方式

        • 加DNS的TXT记录
        • 重定向到你的github项目页面
      • 这里选择第一种比较简单,在购买域名的服务商页面,修改下DNS记录即可。

      • 添加后即可通过验证

    2. 设置gpg

    2.1 gpg是什么?

    • gpg是一个使用RSA算法加解密的软件
    • 有公网的公开仓库,可以上传公钥,供其他服务解密。简单说就是有公网的加解密服务
    • sonatype要求推送的jar包要加密,并会根据信息去公网的仓库验证,成功才能发布。

    2.2 安装gpg

    • mac上直接使用brew install -v gpg安装

    2.3 生成公钥

    • 生成命令gpg --generate-key
      • 执行命令后,会弹出设置passphrase的界面,就是密码,要记住,之后用到maven中
      • 生成后,会有一串字符,即为公钥的key,用于向公共仓库上传公钥。上传时使用最后8位


    2.4 上传公钥

    gpg --keyserver http://keys.openpgp.org:11371 --send-keys C1A767A2
    
    • 注意
      • 再上传时,如果只使用域名,不加端口,也可以成功,但是sonatype验证时会提示找不到key,原因暂未深究。

    3. maven环境配置

    • 之后要使用maven直接上传jar包到sonatype的仓库中
    • 需要对.m2/setting.xml和项目的pom.xml做一些设置

    3.1 将sonatype和gpg信息写入settings.xml

    • sonatype的信息配置在server中,供deploy的时候使用
    <servers>
        <server>
            <id>ossrh</id>
            <username>name</username>
            <password>password</password>
        </server>
    </servers>
    
    • gpg的信息设置在profile中,供maven的gpg插件使用
    <properties>
        <gpg.executable>gpg可执行命令路径</gpg.executable>
        <gpg.passphrase>生成时填写的passphrase</gpg.passphrase>
    </properties>
    

    3.2 项目中的pom配置

    • 主要有两部分,deploy时的信息和要用到的插件
    3.2.1 deploy时的信息包括证书,开发者信息,仓库地址和发布地址
    <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>dothetrick</name>
            <email>flyinthewar@126.com</email>
            <organization>dothetrick</organization>
        </developer>
    </developers>
    
    <scm>
        <tag>master</tag>
        <url>git@github.com:dothetrick/binlogportal.git</url>
        <connection>git@github.com:dothetrick/binlogportal.git</connection>
        <developerConnection>git@github.com:dothetrick/binlogportal.git</developerConnection>
    </scm>
    
    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>
    
        <repository>
            <id>ossrh</id>
            <name>Nexus Release Repository</name>
            <url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>
    
    3.2.2 要用到的maven插件
    • 要使用的插件
      • maven-javadoc-plugin
      • maven-jar-plugin
      • maven-source-plugin
      • maven-gpg-plugin
      • nexus-staging-maven-plugin
    • 使用这些插件是为了生成sonatype要求的各种包
    3.2.3 maven-gpg-plugin报错的处理
    • 在使用时发现maven-gpg-plugin执行报错,Exit Code:2
    • 这个错误是应为下载的gpg版本和maven-gpg-plugin中版本冲突
    • 通过添加如下两个配置文件解决
    • gpg.conf
    use-agent
    pinentry-mode loopback
    
    • gpg-agent.conf
    allow-loopback-pinentry
    
    • 实际配置如下
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <id>attach-javadocs</id>
                <phase>package</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
                <configuration>
                    <additionalOptions>
                        <additionalOption>-Xdoclint:none</additionalOption>
                    </additionalOptions>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
            <archive>
                <manifestEntries>
                    <Built-By>dothetrick</Built-By>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <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-gpg-plugin</artifactId>
        <version>1.6</version>
        <executions>
            <execution>
                <id>sign-artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.8</version>
        <extensions>true</extensions>
        <configuration>
            <serverId>ossrh</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <autoReleaseAfterClose>false</autoReleaseAfterClose>
        </configuration>
    </plugin>
    

    4. deploy

    • 配置好maven后,之后可以通过mvn deploy直接推送包到sonatype
    • 这里设置的是推送后不会自动Release,因为超慢,不知道要多久
    • 所以最好是推送后,在页面上手动执行下release。
    • 重要提示

      • 在发布新版本时,务必先执行mvn clean将target中老版本的jar包删除
      • 不然在发布到nexus后,版本包中会带有老版本的jar包,导致release失败
    • 让jar包更快的在中央仓库被搜索到

      • 当通过maven把jar成功发布到nexus并且release成功后,等了2个小时,也无法在maven中央仓库搜到
      • 网上找了N久无果,打算提工单询问了。突然想试下通过maven能不能下载到,新建一个项目,删除本地m2里面的包缓存,在pom里引用,发现成功了。再去maven中央仓库一搜,就搜到了。。
      • 之后又发了两个版本做实验,确认了,如果不使用maven依赖包的话,等8个小时也搜不到。只有maven下载一次,立马出来了。。

    以上内容属个人学习总结,如有不当之处,欢迎在评论中指正

    相关文章

      网友评论

        本文标题:Maven中央仓库jar包发布全流程详解

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