关于maven:Maven中央仓库jar包发布全流程详解

4次阅读

共计 4490 个字符,预计需要花费 12 分钟才能阅读完成。

须要 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,用于向公共仓库上传公钥

2.4 上传公钥

  • 生成后须要将公钥上传到公共服务器供 sonatype 验证
  • sonatype 应用的三个公共仓库地址,上传任意一个即可,

    • http://keys.openpgp.org:11371
    • http://keyserver.ubuntu.com:11371
    • http://pool.sks-keyservers.net:11371
  • 上传命令
gpg --keyserver http://keys.openpgp.org:11371 --send-keys 398A7FD459F278FB0069E831IK98L741C1A767A2
  • 留神

    • 再上传时,如果只应用域名,不加端口,也能够胜利,然而 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 下载一次,立马进去了。。

以上内容属集体学习总结,如有不当之处,欢送在评论中斧正

正文完
 0