在Mac上通过Gradle将私人库上传到Maven中央仓库
Zemise
Zemise
发布于 2023-06-09 / 57 阅读 / 0 评论 / 0 点赞

在Mac上通过Gradle将私人库上传到Maven中央仓库

1. 前言

​ 平时写java代码的时候,总会用到依赖库,很方便的一点是,可直接通过maven中央库就能把依赖库导入到自己的项目。

​ 现在考虑自己建造轮子,将自己写的依赖库上传到maven中央库。

2. sonatype账号注册

2.1 sonatype注册

网址:https://issues.sonatype.org/secure/Signup!default.jspa

填写页面信息,这里填写的时候,要想清楚,之后不能再更改的。

username和password是用于登陆网站,并且上传依赖库的时候需要用到。

2.2 Group Id的验证

这里有一系列操作,最终的目的是获得归属于自己的group id。

  1. 点击邮箱里发来的登陆链接,填写注册时的用户名和密码

  2. 在主页面面板上创建一个新问题,如下图

2023-05-27 newissue
项目project这里默认选择开源给其他人使用,选open source
问题类型issue type选new project
摘要summary随意写一个自己的依赖库简介
描述description空着,没事,其他非必填项也是一样
包名Group Id这里注意,我们在IDEA引用他人的依赖库的时候,如下所示,每个人的Group Id是固定,所以写一个自己常用,并且能验证的Group Id(也就是能证明是自己的),也可以使用自己的域名,如果没有那么就是用公共的托管地址,请查看具体的规范。这里我用的是GitHub,因此填写的是io.github.zemise
项目链接project URL这里填写自己的项目地址,比如https://github.com/zemise/Voice-Synthesis
SCM URL填写项目的git url,是带.git后缀的,比如https://github.com/zemise/Voice-Synthesis.git
  1. 创建完成后,稍等一会儿,等待管理Bot发来带处理意见的邮件,点击相应链接。我这里附上的是完成后的图,稍微参考下
2023-05-27 deal issue
  • 可以看到他有两条意见,因为我用的是GitHub作为公共托管,他要验证那个域名下就是我,所以让我们临时新建一个开源的GitHub项目(空白都行),名字就是本条问题的工单号,如OSSRH-91967。自己创建完成后,意见中的链接能见到项目就行。
  • 第二条意见是,设置本问题的状态为open,大概位置就是我红色箭头标注的位置,点下就好。
  • 两项注释评论都处理完毕后,等待一会儿,收到congratulation即完成注册。

3. 公钥私钥生成

实际上,之前验证过,没有gpg密钥也能上传依赖库到Maven,但是有一个验证过不了,所以这一步骤还是必要的。

  1. 安装密钥软件

    https://gpgtools.org/

  2. 终端命令行生成密钥

# 查看gpg版本
gpg --version

# 生成公钥对,按提示操作
gpg --gen-key

# 结果如下
pub   rsa3072 2023-06-08 [SC] [有效至:2025-06-07]
      XXXXXXXXXXXXXXXXX示例XXXXXXXXXXXXXXXXXXXX
uid                      zemise <example@qq.com>
sub   rsa3072 2023-06-08 [E] [有效至:2025-06-07]


# 查看生成的密钥对
gpg --list-keys --keyid-format short
# 结果如下
pub   rsa3072/63A65AED 2023-06-08 [SC] [有效至:2025-06-07]
      XXXXXXXXXXXXXXXXX示例XXXXXXXXXXXXXXXXXXXX
uid           [ 绝对 ] zemise <example@qq.com>
sub   rsa3072/D32C9D61 2023-06-08 [E] [有效至:2025-06-07]

​ 其中斜杠后的字符编号,如63A65AED,即为公钥编号,后面需要用到

  1. 导出私钥
# 会在你当前目录生成一个secring.gpg
gpg --export-secret-keys -o secring.gpg
  1. 同步公钥到公网
gpg2 --keyserver hkp://keyserver.ubuntu.com --send-keys 63A65AED

# 结果如下
gpg: 正在发送密钥 XX示例XX63A65AED 到 hkp://keyserver.ubuntu.com

​ 注意63A65AED为上面得到的编号

​ 完成后,别人需要用公钥去验证是你的签名

4. 上传私人依赖库

​ 这一部分内容,详见《Gradle入门至进阶记录》里的,publishing 项目发布。

​ 这里只简单实现,不做过多解释。

​ 下方主要是以build.gradle和gradle.properties两个文件配置,对于多模块的项目会更加方便,以及复用。简单项目其实也可以单个build.gradle文件全部填写完。

4.1 配置build.gradle

plugins {
    id 'java-library'
    // 引入发布插件
    id 'maven-publish'
  	// 验证插件,只有上传Maven中央库时需要,私人或者本地库不需要
    id 'signing'
}

repositories {
    maven {
        url 'https://maven.aliyun.com/repository/public'
    }
    mavenLocal()
    mavenCentral()
}

dependencies {
    implementation 'org.projectlombok:lombok:1.18.26'
    annotationProcessor 'org.projectlombok:lombok:1.18.26'

    implementation 'ch.qos.logback:logback-classic:1.4.6'
    implementation 'ch.qos.logback:logback-core:1.4.6'

    implementation 'com.squareup.okhttp3:okhttp:4.11.0'
    implementation 'org.java-websocket:Java-WebSocket:1.3.8'
    implementation 'com.google.code.gson:gson:2.8.9'

}

group = 'io.github.zemise'
version = '1.0.0'

// 带源码和javadoc的发布:需要'java-library'插件支持:它是java的升级版,java插件的功能java-library都有
// 生成javadoc前,要确保代码注释方面都按规范写好
javadoc.options.encoding="UTF-8"
java {
	withJavadocJar()
	withSourcesJar()
}


publishing {
    publications {
        mavenJava(MavenPublication) {
            // 项目名称
            artifactId = 'Voice-Synthesis'
            from components.java

            pom {
                name = "Voice-Synthesis(项目名称)"
                description = "调用讯飞语音合成API(项目描述)"
                url = "https://github.com/zemise/Voice-Synthesis"
                licenses {
                    license {
                        name = "The Apache License, Version 2.0"
                        url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
                    }
                }

                developers {
                    developer {
                        id = 'zemise'
                        name = 'zemise'
                        email = 'example@qq.com'
                    }
                }

                scm {
                    connection= "scm:git:https://github.com/zemise/Voice-Synthesis.git"
                    developerConnection="scm:git:https://github.com/zemise/Voice-Synthesis.git"
                    url= "https://github.com/zemise/Voice-Synthesis(源码地址)"
                }

            }
        }
    }

    repositories {
        // 发布项目到私服中
        maven {
            def releasesRepoUrl = PERSONAL_MAVEN_URL
            def snapshotsRepoUrl = PERSONAL_MAVEN_SNAPSHOT_URL
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
            credentials {
                username = PERSONAL_USERNAME
                password = PERSONAL_PASSWORD
            }
        }

        // 发布项目到maven中央仓库
        maven {
            // 中央仓库名
            // name 'Nexus_Repo'
            def releasesRepoUrl = CENTRAL_URL
            def snapshotsRepoUrl = CENTRAL_SNAPSHOT_URL
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

            credentials {
                username = CENTRAL_USERNAME
                password = CENTRAL_PASSWORD
            }
        }
    }
}

signing {
    sign publishing.publications.mavenJava
}

jar {
    from {
        duplicatesStrategy = 'exclude'
        exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF',
                'AUTHORS', 'changelog.*', 'LICENSE*', 'module-info.class', 'README*', 'release-timestamp.*'
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
  
  

4.2 配置gradle.properties

// 配置gradle.properties

// 注意,下方的变量名可随意写,但是要要记得在build.gradle里一一匹配                                                           
// personal Maven setting 私人仓库
PERSONAL_MAVEN_URL=https://maven.cellcraft.top/repository/maven-releases/
PERSONAL_MAVEN_SNAPSHOT_URL=https://maven.cellcraft.top/repository/maven-snapshots/
PERSONAL_USERNAME=username
PERSONAL_PASSWORD=password

// Central Maven setting maven中央仓库
CENTRAL_URL=https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
CENTRAL_SNAPSHOT_URL=https://s01.oss.sonatype.org/content/repositories/snapshots/
CENTRAL_USERNAME=username
CENTRAL_PASSWORD=pathword


// 以下非必要
signing.keyId=63A65AED(公钥编号)
signing.password=私钥密码
signing.secretKeyRingFile=/path/My_Code/java/secring.gpg(私钥存放的绝对路径)                                                               
                                                                  

配置完成后,可以点右侧Gradle可视化的publish也可以在项目根目录使用指令

./gradlew publish

# 或者使用本地的gradle
gradle publish

如果没有报错,则上传成功

拓展1:

​ 一旦确定版本号,上传了release版本,那么同一版本再继续上传是无法覆盖的,最后需要在网站里删除才行。而SNAPSHOT版本,似乎是可以覆盖的,因此最好先上传SNAPSHOT版本,测试无误后再上传最终的release版本。

4.3 sonatype Maven登陆

  1. 前往maven网站登陆查看,右上角登陆输入之前注册时的账号密码。

  2. 点击左侧Staging Repository,并点击Refresh刷新。

  3. 选中上传的release版本,点击close,如果无错误,则再点击release即可。

    如最开始创建Maven账号提交的issue等待管理审核一样,最后的审核也需要稍微耐心等待些时间。

5. 总结

  1. 不要使用mac的gpg页面进行导出,导出的文件不是我们使用的私钥文件格式不正确

  2. 注意公钥一定记得同步到公网上去,不然签名验证会失败


评论