如何推送个人项目至Maven中央仓库

1. 开篇

前段时间使用Gitee仓库搭建了一个Maven私有仓库,将一些开源包放到上面去,感觉使用起来还是不太方便,最近就折腾将这些包提交到Maven的中央仓库中。项目第一次提交Maven还是挺麻烦的,所以写个文章Mark一下。

2. 操作步骤

2.1. 提交申请

注册一个sonatype.org帐号,登陆并提交一个issue,没错,就是提交一个issue,具体可参考如下:

image.png

image.png

其中:

  • 问题类型:一定要选New Project
  • 概要:填项目名称;
  • 描述:可不填;
  • Group Id:填写你的项目ID,需注意的是这个Group Id对应的域名需要是你持有的,后续会验证这项;
  • Project URL:就是项目主页地址;
  • SCM url:就是Git仓库地址;
  • username:填写你在sonatype JIRA的用户名,也可以填写别人的,这个用户名用于推送项目,所以要注意。
  • Already Synced to Central:是指你是否准备好提交到中央仓库了,应该是给官方人员判断是否需要优先处理。

2.2. 配置项目

2.2.1. 配置settings.xml

在Maven的settings.xml文件中增加<server>配置,配置你sonatype的账号密码,参考如下:

<servers>
        <server>
            <id>sonatype-nexus-snapshots</id>
            <username>demo</username>
            <password>******</password>
        </server>
        <server>
            <id>sonatype-nexus-staging</id>
            <username>demo</username>
            <password>******</password>
        </server>
        
    </servers>

2.2.2. 配置pom.xml

  • 增加licensescmdeveloper信息。
    <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@gitee.com:centy/xxl-job-spring-boot-starter.git</url>
        <connection>scm:git:git@gitee.com:centy/xxl-job-spring-boot-starter.git</connection>
        <developerConnection>scm:git:git@gitee.com:centy/xxl-job-spring-boot-starter.git</developerConnection>
    </scm>
    <developers>
        <developer>
            <name>centychen</name>
            <email>292462859@qq.com</email>
        </developer>
    </developers>
  • 增加release的profile配置,注意:distributionManagement.snapshotRepositorydistributionManagement.repository的id需与settings.xml中对应的server记录ID一致;distributionManagement的url根据官方反馈的url修改。
     <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!-- Source -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.0.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>3.1.0</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.5</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!--Compiler-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.8.0</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <fork>true</fork>
                            <verbose>true</verbose>
                            <encoding>UTF-8</encoding>
                            <showWarnings>false</showWarnings>
                        </configuration>
                    </plugin>
                    <!--Release-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>2.5.3</version>
                    </plugin>
                </plugins>
            </build>
            <distributionManagement>
                <snapshotRepository>
                    <id>sonatype-nexus-snapshots</id>
                    <name>Sonatype Nexus Snapshots</name>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>sonatype-nexus-staging</id>
                    <name>Nexus Release Repository</name>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

2.3. 安装及配置PGP

  • Mac安装PGP,我是通过brew安装的,使用命令brew install gpg执行安装;
  • 使用命令gpg --gen-key生成公私钥,按照提示信息一步步操作,需要记住加密使用的Passphrase,下面步骤需使用;
  • 上传公钥至公钥服务器,可通过gpg --list-keys查看公钥ID,通过一下命令上传:
gpg --send-keys [公钥ID] --keyserver hkp://keyserver.ubuntu.com:11371

2.4. 构建并部署

2.4.1. 构建SNAPSHOT版本

  • 版本号修改为***-SNAPSHOT格式,如1.0.0-SNAPSHOT
  • 执行以下命令开始构建:
mvn clean deploy -P release -Dmaven.test.skip=true 

2.4.2. 构建RELEASE版本

  • 版本号修改为***-RELEASE或者无后缀格式,如1.0.0-RELEASE1.0.0
  • 构建并Deploy
mvn clean deploy -P release -Dmaven.test.skip=true
  • Deploy的时候会弹出一个输入Passphrase的页面,输入刚才生成pgp公私钥使用的密码。

    image.png

  • 登陆https://oss.sonatype.org/,点击左侧Staging Repositories,输入你的group id查找,可看到deploy记录:

    image.png

  • 选中Deploy记录点击CloseConfirm,刷新后会发现记录状态已经变成Closed

  • 再选中记录点击ReleaseConfirm完成发布,发布完成后需要等待中央仓库同步,我是等了1个多小时才能在中央仓库搜索出来。

3. 可能踩到的坑

3.1. gpg: signing failed: Inappropriate ioctl for device

使用mvn clean deploy命令构建时,可能会报gpg: signing failed: Inappropriate ioctl for device,是因为无法弹出Passphrase页面,需要在系统环境变量中增加export GPG_TTY=$(tty)

3.2. Access denied to staging repository

如果Deploy的时候报Access denied to staging repository...等错误,恭喜你,你的帐号权限有问题,需要再提一个issue处理该问题,可参考我提的issue

3.3. 在Staging Repositories中执行Close操作不成功,状态依然是Open。

应该是执行close操作的数据校验有问题,比如pom.xml信息缺失等,我第一次提交的时候就没有在pom.xml中配置project name,校验就没有通过。留意页面下方Activity中的错误信息即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342