发布jar包到maven中央库

最近将一个开源项目发布到maven中央库,记录一下发布过程,以及遇到的坑。

创建账号

sonatype是使用jira管理工单的,如果我们要新建工单,首先需要创建一个账号,这个账号同样可以用sonatype的Nexus,我们通过Nexus最终发布到中央库。

打开链接 https://issues.sonatype.org/secure/Signup!default.jspa 去注册一个账号

创建工单

登录jira管理界面后,点击上方 Create 按钮,创建工单。

这里写图片描述

Project: 选 Community Support - Open Source Project Repository Hosting
Type: 选 New Project
Summary: 主题,必填, 根据实际情况填写
Description: 描述,选填, 根据实际情况填写
Attachment: 附件,选填
Group Id: 项目的GroupId, 同pom.xml中的GroupId一致, 必填
Project URL: 项目的url, 必填,如果项目代码在github上,一般填入项目的github url
SCM url: SMC(Software Configuration Management)是软件配置管理的意思,如果项目代码在github上,填入github的下载地址 如 git@github.com:SpringCloud/spring-cloud-gray.git
Already Synced to Central: 是否已经同步到中央库,如果没有选No就可以了。

然后点Create提交,等待工作人员review。这时,工单的状态是Open, 如果提供的信息没有问题的话, 状态会从open变成resolved。当然由于时差的关系,一般会在下午或晚上收到回复。

这里写图片描述

在这过程中,我收到的第一个回复是询问我是否拥有springcloud.cn域名的所有权,因为工单中填写的groupId是cn.springcloud。

第二个回复是将状态从Open变为Resolved时回复,表示可以进行下一步操作了。

配置工程pom.xml

第一种是在工程的pom.xml中引入oss-parent父依赖,可以省去一些发布配置:

<parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>7</version>
</parent>

接着在pom中完善license、scm、developer的信息。
但是这种方式在已经有父依赖的情况下就很尴尬,建议采下面第二种。

第二种是将oss-parent中的配置复制出来,然后稍做修改,以spring-cloud-grap为例:

<groupId>cn.springcloud.gray</groupId>
    <artifactId>spring-cloud-gray</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>
    <modules>
		...
    </modules>

	<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>
    <scm>
        <tag>master</tag>
        <url>git@github.com:SpringCloud/spring-cloud-gray.git</url>
        <connection>scm:git:git@github.com:SpringCloud/spring-cloud-gray.git</connection>
        <developerConnection>scm:git:git@github.com:SpringCloud/spring-cloud-gray.git</developerConnection>
    </scm>
    <developers>
        <developer>
            <name>saleson</name>
            <email>qlichunyu@163.com</email>
            <organization>Spring Cloud中国社区</organization>
        </developer>
    </developers>

	<dependencyManagement>
		...
	</dependencyManagement>
	
	<profiles>
        <profile>
            <id>sonatype-oss-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>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- GPG -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.1</version>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <version>${maven_nexus_staging_version}</version>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>oss</serverId>
                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                            <!-- 能够实现自动关闭-》自动发布,需要使用插件:nexus-staging-maven-plugin 来处理,autoReleaseAfterClose 参数控制 -->
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>flatten-maven-plugin</artifactId>
                        <version>${maven_flatten_version}</version>
                        <configuration>
                            <updatePomFile>true</updatePomFile>
                            <flattenMode>oss</flattenMode>
                            <pomElements>
                                <dependencies>expand</dependencies>
                            </pomElements>
                        </configuration>
                        <executions>
                            <execution>
                                <id>flatten</id>
                                <phase>process-resources</phase>
                                <goals>
                                    <goal>flatten</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>flatten.clean</id>
                                <phase>clean</phase>
                                <goals>
                                    <goal>clean</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>sonatype-nexus-snapshots</id>
                    <url>
                        https://oss.sonatype.org/content/repositories/snapshots
                    </url>
                </snapshotRepository>
                <repository>
                    <id>sonatype-nexus-staging</id>
                    <url>
                        https://oss.sonatype.org/service/local/staging/deploy/maven2
                    </url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

可参考 https://github.com/SpringCloud/spring-cloud-gray/blob/master/pom.xml

配置maven setting.xml添加server

打开maven的settings.xml配置文,配置sonatype账号信息

  <servers>
    <server>
      <id>sonatype-nexus-snapshots</id>
      <username>Sonatype 账号</username>
      <password>Sonatype 密码</password>
    </server>
    <server>
      <id>sonatype-nexus-staging</id>
      <username>Sonatype 账号</username>
      <password>Sonatype 密码</password>
    </server>
    <server>
      <id>oss</id>
      <username>Sonatype 账号</username>
      <password>Sonatype 密码</password>
    </server>
  </servers>

注意server.id需要和工程pom.xml中的snapshotRepository.id对应上。

配置gpg-key

gpg-key是用来对代码、二进制包进行签名校验用的,windows系统通过https://www.gpg4win.org/download.html下载安装,例如Mac的安装:

运行命令,安装gpg

brew install gpg

在使用brew安装的时候,还出现过一次因为权限导致安装失败的情况,而使用sudo又无法安装,这时需要chown 命令赋权。

安装完成之后,运行命令生成密钥

gpg --gen-key

这里写图片描述

红框内都是需要键盘输入的,第三个是大写的O。
注意,再后要求输入密码,这个密码需要记录,等会mvn deploy时需要用天

之后会得到pub编号,下面红框内的就是。
将pub编号上传到key验证库

gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys B72E74B6790AC40083CCB60A0D90C381F96365D0

这里写图片描述

构建到sonatype的Nexus

进入工程目录下,运行mvn命令发布

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密钥密码" 

如果另建了maven 的setting.xml文件,运行类似如下的命令

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=密钥密码" --settings /dev_tools/apache-maven-3.3.9/conf/settings-oss.xml

如果执行失败,并且报错如下:

gpg: signing failed: Inappropriate ioctl for device

这说明你安装的gpg版本较新,需要额外配置,在gpg安装目录(mac的是 ~/.gnupg)下建立两个配置文件:gpg.conf、gpg-agent.conf,分别添加如下内容:
gpg.conf

use-agent
pinentry-mode loopback

gpg-agent.con

allow-loopback-pinentry

在mac上还出现过这样的情况:

gpg: WARNING: unsafe permissions on homedir '~/.gnupg'
gpg: 签名时失败: Bad passphrase

一直没找到解决方法,后来干脆加上 -Dgpg.skip 跳过

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=xiaoyu" -Dgpg.skip --settings /apache-maven-3.3.9/conf/settings-oss.xml

保存后再次执行上面的mvn命令,如果还有报错,可能maven配置出了问题,检查maven配置是否有语法错误,配置的账号和密码等有无需要转义的特殊字符,如’&‘需要转为’&amp;’。还需要注意的是生成密钥和执行部署命令的必须是同一台机器。

自动验证gpg密码

在项目pom.xml中添加plugin

					<plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

在maven的settings.xml中,添加gpg密码信息,例:

  <profiles>
	<profile>
      <id>oss-gpg</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <!-- mac use pgp2 -->
        <gpg.executable>gpg</gpg.executable>
        <gpg.passphrase>xiaoyu</gpg.passphrase>
      </properties>
    </profile>
  </profiles>

mvn 脚本可以简化:

mvn clean deploy -P sonatype-oss-release -P oss-gpg -DskipTests --settings /apache-maven-3.3.9/conf/settings-oss.xml

这样可以实现自动打包上传发布到maven中央库

发布

以上都执行成功后,在nexus中应该已经有刚才发布的构件了,访问https://oss.sonatype.org/#stagingRepositories (左边 Build Promotion --> Staging Repositories) 查看,一般是最后一个,可以按时间倒弃查看,也可以通过右上角的搜索框查找。

如果要登录的话,账号和jira(创建工单时)是同一个。

此时的状态应该是open,选中构件, 点击上方的Close->Confirm,nexus会去做一些处理以及校验,如果校验失败,需要删除构件,修改后得新上传。

这里写图片描述

如果校验成功,选中构件,点击上方的Release->Confirm,发布成功后,状态会变成Releaed, 然后自动删除。

可以在页面左侧点击Advanced Search 查看,如果能搜到发布的模块,说明已经成功了。

这里写图片描述

再查看一下jira中的工单,系统多出一条评论,意思通常10分钟内会发布到maven中央库,但如果更新到search.maven.org需要两个小时。

小细节:
1)自动化构建需要解决两方面的问题,使用gpg插件弹出密码框的问题。这个可通过不在maven命令行中输入:-Darguments=“gpg.passphrase=”,改用在setting.xml中定义的方式。

    <profile>
      <id>oss-gpg</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <!-- mac use pgp2 -->
        <gpg.executable>gpg</gpg.executable>
        <gpg.passphrase>xxx</gpg.passphrase>
      </properties>
    </profile>

2)针对发布到oss的临时库,是否也能够实现自动关闭-》自动发布?这个需要使用插件:nexus-staging-maven-plugin 来处理,autoReleaseAfterClose 参数控制。

<plugin>
 <groupId>org.sonatype.plugins</groupId>
 <artifactId>nexus-staging-maven-plugin</artifactId>
 <version>1.6.7</version>
 <extensions>true</extensions>
 <configuration>
 <serverId>oss-rr</serverId>
 <nexusUrl>https://oss.sonatype.org/</nexusUrl>
 <autoReleaseAfterClose>false</autoReleaseAfterClose>
 </configuration>
</plugin>

参考资料:
记一次向maven中央仓库提交依赖包
Jar自动发布到maven中心库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值