【绝非标题党】超恶心,踩了无数坑,终于能成功上传到maven central

作为持续搬砖的老鸟,不开源写点东西,在未来的求职路上,真的是占优势啊。我之前写过一些开源库,上传到bintray上面的,奈何现在访问不了,只能想办法迁移到maven central。

在迁移到maven central的过程中,踩过了无数坑,分享给大家,希望大家少走弯路,写得不对的地方,欢迎大家批评指正。


上传方式选择

我采用的是上传zip包到maven central的方式。看了一下官方文档,支持多种方式上传到maven central。
官方文档

温馨提示:官方文档全是英文的,看起来超累,不过我在上传的过程中,所有遇到的问题,其实在文档中都能找到答案。


详细步骤说明

第一步:注册账号与命名空间

在如下的网站Maven Central注册一个账号,并申请一个命令空间(namespace),需要等到namespace验证通过,就可以上传库到maven central了。

第二步:上传zip包示例

给大家展示一下上传zip包的页面:

从这个截图可以看到,我已经上传成了一个库netannotation库。具体上传的时候,需要填写deployment name, description,以及上传一个zip包。这个zip包一定要符合他们的各种条条款款才能上传成功的。


第三步:必须包含的JAR文件

当时遇到的第一个坑就是这个zip包里面必须包含source.jarjavadoc.jar文件,如果没有这两个文件,上传到maven的时候,是审核不通过的。

解决方案:在build.gradle文件下面配置:

groovy 复制代码
// 生成源码 JAR
task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    archiveClassifier = "sources"
}

// 生成 JavaDoc JAR
task javadocJar(type: Jar, dependsOn: javadoc) {
    from javadoc.destinationDir
    archiveClassifier = "javadoc"
}

第四步:完整build.gradle配置

build.gradle文件里面配置的信息比较多,一个都不能少,按照文档来配置肯定不会错:

ini 复制代码
groovy
复制
apply plugin: 'maven-publish'

publishing {
    publications {
        release(MavenPublication) {
            groupId = 'io.github.richzjc'
            artifactId = 'netannotation'
            version = '1.0.0'
            
            afterEvaluate {
                artifact("$buildDir/libs/${project.name}.jar")
            }
            
            artifact sourcesJar
            artifact javadocJar

            pom {
                name = "netannotation"
                description = "运用编译时注解生成代码,所用到的注解"
                url = "[email protected]:richzjc/NetworkListener.git"

                developers {
                    developer {
                        id = "richzjc"
                        name = "richzjc"
                        email = "[email protected]"
                    }
                }

                licenses {
                    license {
                        name = "The Apache License, Version 2.0"
                        url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
                    }
                }

                scm {
                    connection = "scm:git:[email protected]:richzjc/NetworkListener.git"
                    developerConnection = "scm:git:ssh://github.com:richzjc/NetworkListener.git"
                    url = "https://github.com/richzjc/NetworkListener.git"
                }
            }
        }
    }

    repositories {
        maven { url "file://${rootDir}/repo" }
    }
}

第五步:执行发布命令

执行命令:
./gradlew :netannotation:publish --quiet

(将netannotation改成你自己的模块名称)


第六步:GPG签名配置

  1. 细心的朋友肯定能发现,这个文件目录下面没有.asc文件,这是因为上传到maven central的文件需要通过gpg进行签名。因此得在电脑上首先安装gpg命令,没有安装的朋友,网上资料很多,首先安装gpg命令。安装了gpg命令后在终端生成密钥,执行如下命令gpg --gen-key 按照提示操作,一步一步输入信息,就可以生成密钥了。

  2. 参考文档:central.sonatype.org/publish/req...

---send-keys后面的密钥id, 可以通过 gpg --list-keys 查看相应的密钥id


第七步:公钥和私钥有了, 接下来就是要通过gpg对repo文件进行签名了。我写了一个shell脚本,分享给大家:

bash 复制代码
bash
复制
#!/bin/bash

if [ $# -ne 1 ] || [ ! -d "$1" ]; then
    echo "Usage: $0 <directory_path>"
    exit 1
fi

find "$1" -type f -print0 | while IFS= read -r -d '' file; do
    echo "Verifying: $file"
    gpg -ab "${file}"
done

执行这个脚本的时候,需要传repo的路径。 如sh gpg.sh ./repo 将上面的shell脚本保存到了gpg.sh目录下面。 执行了这个命令就 可以看到后缀为.asc的文件了。


第八步:metadata文件陷阱。到这里,离成功上传到maven越来越近了。但是在这一步我又遇到了一个坑。先看一下截图:

重要提醒:必须删除metadata相关文件,否则审核不通过!


第九步:前期工作都已经做完了, 最后一步就是压缩成zip包上传到maven central , 在这里我又遇到了一个坑,上传的zip包路径必须要与申请的namespace匹配上, 匹配不到也是审核不成功的, 针对我注册的namespace, 我需要将io目录压缩成zip包上传到maven central, 多了一级目录,少了一级目录都是不行的。如果上传后有问题,就根据上传页面给到的信息,相应修改即可。

必须将io目录压缩成zip包,路径层级与namespace严格对应


最后寄语

祝你好运!遇到了问题可以留言一起讨论!!!!!

相关推荐
super凹凸曼9 分钟前
分享一个把你的API快速升级为MCP规范的方案,可在线体验
java·后端·开源
dora13 分钟前
Flutter的屏幕适配
android·flutter
KuaFuAI16 分钟前
DeepSeek开源引爆AI Agent革命:应用生态迎来“安卓时刻”
人工智能·开源·agent·deepseek
luoganttcc16 分钟前
开源的自动驾驶模拟器
人工智能·开源·自动驾驶
SoulKuyan36 分钟前
android 发送onkey广播,Android 添加键值并上报从驱动到上层
android
Yang-Never37 分钟前
ADB->查看某个应用的版本信息
android·adb·android studio
居然是阿宋3 小时前
Android RecyclerView 多布局场景下的设计思考:SRP 与 OCP 的权衡与优化
android·开闭原则·单一职责原则
前行的小黑炭3 小时前
Retrofit框架分析(二):注解、反射以及动态代理,Retrofit框架动态代理的源码分析
android·kotlin·retrofit
zach3 小时前
android项目如何修改第三方类库,导入到自己的项目中
android·前端·架构
三思而后行,慎承诺3 小时前
安卓的Launcher 在哪个环节进行启动
android