这里首先吐槽一下,MavenCenter真心发布太难用,而华为官方的教程更是半吊子,如果第一次使用Maven发布的同学,基本不可能顺利发布,笔者前后消耗近2周时间。

希望这个文章能给想发布鸿蒙自定义组件的同学带来一点帮助,少走坑和弯路,心愿足矣

目录

1.资料

1.1排雷

1.2选择

2.上传前步骤

2.1.注册账号

2.2 安装GPG

2.3.新建开源代码

3.上传

4.操作Nexus

注意坑来了,在点击release的时候,一定更要选中har包,不然会发布成.module后缀的发布包,这也是2.2.1版本无奈产生的原因。

6.最后一步,关闭Jira的Issue

 7.总结


1.资料

互联网的资料多如横河沙数,你可以搜到很多资料,但是大部分没用,还可能误导你。

1.1排雷

1)如果你没有用过MavenCenter去发布,一定会去找资料,那么找到的一般都是Java发布到MavenCenter,Android发布到MavenCenter,前者是jar包,后者是aar包,而鸿蒙是har包,所以基本上不能通用。

2)那么一定会想,为什么JitPack发布,那个不是很简单,直到你搜到这篇文章:如何把自己的module(第三方库)发布到jitpack,它会让你死心,目前来说,Android发布过去很简单,但是鸿蒙,因为一些系统库并没有的关系,无法在上面发布。

3)发布到华为自己的仓库呢,百度了很久,注册了华为云,结果发现,它是一个类似于Github和Gitee一样的平台,并非像Jitpack和MavenCenter一样的托管平台。(后来发现其实是有的,叫HAPM,但是百度照死搜不到)。

1.2选择

感谢华为的开发者联盟,让我搜到了两篇很不错的文章,终于能够踏出第一步,之前用百度搜,根本连发布的门都进不去:

1)华为官方写的文章

HarmonyOS开源三方组件Maven&HAPM发布流程指导https://developer.huawei.com/consumer/cn/forum/topic/0202621903943050069?fid=0101303901040230869https://developer.huawei.com/consumer/cn/forum/topic/0202621903943050069?fid=0101303901040230869读完这篇文章,我才发现是有HAPM这个华为自己的托管平台的,但是因为我选择了MavenCenter,所以后面的没选择用HAPM,还要装Node.js等一类软件才行。

这篇文章有两个问题:

1.直接发布到Release,而不是走Nexus的staging->close->release的步骤,不知道会有什么风险(这个我没验证,只是参照了步骤,因为他们用到signing组件,我觉得可能过不去gpg校验)。

2.只讲到了发布到Nenus的步骤,即只说了90%的步骤,还差10%,你不知道怎么走?

2)LV6的楼主写的文章

造轮子教程:把鸿蒙库(har)开源到中央仓库(maven)的gradle配置https://developer.huawei.com/consumer/cn/forum/topic/0202595700752730458?fid=0101587866109870106https://developer.huawei.com/consumer/cn/forum/topic/0202595700752730458?fid=0101587866109870106这篇文章,只说70%的步骤,不过比较好的是,它前70%的步骤写的都比较详细,你能够比较容易的走完,然后30%就走不下去了。

以上两篇文章都默认你是发布过MavenCenter的经验的,对入门初学者并不友好,不过笔者能够顺利提交到MavenCenter,也是基于这两篇文章的融合。感谢以上两位作者!

2.上传前步骤

2.1.注册账号

首先需要有maven(oss)账号:Java开发|Maven中央仓库注册以及发布Java项目 - 墨天轮,这篇文章把注册步骤写的很详细了,可以完全照搬,就是要注意一点,GroupID不能随便写,这点它没有详细说,所以笔者这里展开说下:

android代码工程转鸿蒙 安卓代码迁移鸿蒙_java

 这个红色圈出来的就是GroupID,如果你是托管在Gitee上或者Github上,需要遵守一个命名规则:

android代码工程转鸿蒙 安卓代码迁移鸿蒙_maven_02

如果你是自己的网站,你需要在自己的网页写个重定向,可以让你的GroupID直接重定向到你的主页,他们的目的很简单,证明这个主页是你的!其它步骤按照文章中所说即可。

2.2 安装GPG

 安装并配置 GPG(发布到 Maven 仓库中的所有文件都要使用 GPG 签名,以保障完整性):Java开发|Maven中央仓库注册以及发布Java项目 - 墨天轮,还是这篇文章,基本参考就可以,这里也补充一点吧,它没说到,我采坑到了

GPG秘钥传服务器的时候,Maven验证是有三个地址的,它这里只说了一个,可能因为一些原因,这些服务器会暂时关停,所以发布不了你的指纹到公网上,三个地址的发布命令:

gpg --keyserver hkp://pgp.mit.edu:11371 --send-keys xxx(你的指纹)
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys xxx(你的指纹)
gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys xxx(你的指纹)

第二个就是它文章里推荐的GPG服务器,这个如果你发布成功了,就不需要再发布另外两个了,Maven是三个轮询的。

它的步骤应该是这样的,你要发布一个组件,为了完整性和篡改,你要同步把公钥上传上来,Maven拿着公钥去上面三个服务器去验证信息,如果验证成功了,就证明是你,否则验证失败了,你就发布不了。

然后文章看到安装GPG,就够了,第四步就不要看了,因为那已经是Java的东西了,和鸿蒙没关系了再看你也看不懂了。

android代码工程转鸿蒙 安卓代码迁移鸿蒙_上传_03

图中这步骤,就不要看了。

2.3.新建开源代码

新建需要开源的项目,结构参考:

ViewModel_for_ohoshttps://gitee.com/ethan-osc_admin/viewmodel_for_ohos/tree/exam%2Fmaven/https://gitee.com/ethan-osc_admin/viewmodel_for_ohos/tree/exam%2Fmaven/大概思路是这样的:

1)写一个专门的upload.gradle文件,作为上传脚本(上传后,mavencenter自动帮你打包),这里配置了要发布组件的基本信息,远程仓库地址以及你的远程仓库的用户名和密码

apply plugin: 'maven-publish'
apply plugin: 'maven'
apply plugin: 'signing'

def DEFAULT_POM_NAME = 'ohos_viewmodel_livedata'
def DEFAULT_POM_VERSION = '2.2.1'  //har包版本信息
def DEFAULT_POM_ARTIFACT_ID = "ohos_viewmodel_livedata"  //har包ID
def DEFAULT_POM_GROUP_ID = 'io.gitee.ethan-osc_admin'  //项目组ID
def DEFAULT_POM_PACKAGING = 'har'  //包类型,固定为har
def DEFAULT_POM_DESCRIPTION = 'viewmodel and livedata for harmonyos'
def MAVEN_USERNAME = 'xxxx'   //你自己的远程Maven仓的用户名
def MAVEN_PASSWORD = 'xxxx'  //你自己的远程Maven仓的密码
def REMOTE_MAVEN_REPOSITORY_URL = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2'  //远程Maven仓地址
//申请maven中央仓库参考:https://www.modb.pro/db/54557
//仓库配置参考:https://central.sonatype.org/publish/publish-gradle/
//上传成功后:https://s01.oss.sonatype.org/#stagingRepositories


publishing {
    publications {
        maven(MavenPublication) {
            group = DEFAULT_POM_GROUP_ID
            artifactId = DEFAULT_POM_ARTIFACT_ID
            version = DEFAULT_POM_VERSION
            pom {
                group = DEFAULT_POM_GROUP_ID
                artifactId = DEFAULT_POM_ARTIFACT_ID
                version = DEFAULT_POM_VERSION
                url = REMOTE_MAVEN_REPOSITORY_URL
                name = DEFAULT_POM_NAME
                description = DEFAULT_POM_DESCRIPTION
                packaging = DEFAULT_POM_PACKAGING
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id = 'iogiteeethan-osc_admin'
                        name = 'ethenwei'
                        email = 'ethenwei@qq.com'
                    }
                }
                scm {
                    connection = 'scm:svn:http://foo.googlecode.com/svn/trunk/'
                    developerConnection = 'scm:svn:https://foo.googlecode.com/svn/trunk/'
                    url = 'http://foo.googlecode.com/svn/trunk/'
                }
            }
        }
    }

    repositories {
        maven {
//                url = LOCAL_MAVEN_REPOSITORY_URL  //发布到本地Maven仓
            //发布到远程Maven仓的地址以及Maven仓的帐号和密码
            url = REMOTE_MAVEN_REPOSITORY_URL
            credentials {
                username MAVEN_USERNAME
                password MAVEN_PASSWORD
            }
        }
    }
}
signing {//秘钥配置请看:gradle.properties
    sign publishing.publications.maven
}

afterEvaluate { project ->
    DEFAULT_POM_ARTIFACT_ID = project.name
    publishing {
        publications {
            maven(MavenPublication) {
                from components.release  //指定发布的har包类型为debug或release
                group = DEFAULT_POM_GROUP_ID
                artifactId = DEFAULT_POM_ARTIFACT_ID
                version = DEFAULT_POM_VERSION
                pom {
                    name = DEFAULT_POM_NAME
                    description = DEFAULT_POM_DESCRIPTION
                    packaging = DEFAULT_POM_PACKAGING
                }
            }
        }
    }
}

 这个模板文件,基本改下def里面的信息和开发者的信息,就可以直接用

注意:区分上传的是har包还是jar包,需要对应修改upload.gradle文件中from 属性,发布har包使用字段components.release,发布jar包使用components.java

android代码工程转鸿蒙 安卓代码迁移鸿蒙_harmonyos_04

2)要上传哪个组件,就在那个组件的build.gradle里面apply from这个upload.gradle文件

apply plugin: 'com.huawei.ohos.library'
//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510

// 上传完Maven之后需要删除该行代码,否则工程编译会报错
// 有了这一行,才会出现publish的按钮
apply from: '../upload.gradle' 

ohos {
    compileSdkVersion 5
    defaultConfig {
        compatibleSdkVersion 5
    }
    buildTypes {
        release {
            proguardOpt {
                proguardEnabled false
                rulesFiles 'proguard-rules.pro'
            }
        }
    }
    
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.13'
}

3)修改gradle.properties,配置GPG证书的指纹id和提取密码,远程仓库的账号和密码

#gpg文件和密钥对
#导出secretKeyRingFile的命令:gpg --export-secret-keys -o secring.gpg
#使用短keyId的命令:gpg --list-keys --keyid-format short
signing.keyId=指纹后8位
signing.password=生成指纹的时候设置的密码
signing.secretKeyRingFile=../../../secring.gpg(该副本文件的本地地址)

#https://s01.oss.sonatype.org/ 账号和密码
ossrhUsername=xxxx
ossrhPassword=xxxx

到这一步,70%的工作算是完成了,也就是笔者说的第二篇文章的内容就结束了,后面没说怎么搞。

3.上传

android代码工程转鸿蒙 安卓代码迁移鸿蒙_上传_05

 只有Gradle里面写了apply for upload.gradle,点击之后,就可以上传了,一般上传可能出错,就是配置里面的gpg的keyid,密码,maven的用户名和密码写错了,这点特别注意然后,你就可以在Nexus Manager里面看到你提交的了。

4.操作Nexus

//上传成功后:https://s01.oss.sonatype.org/#stagingRepositories

 访问这个地址,可以看到你上传的

android代码工程转鸿蒙 安卓代码迁移鸿蒙_上传_06

笔者一开始的版本是2.2.0,尝试了几次,一直报错,所以留着了,把版本改成2.2.1发布了,2.2.0留着提醒自己错误的原因。

如果上传成功后,可以在这个页面一次点击1234,3就是说关闭这次Issue,4就是把它发布,放到release目录下去,当然如果过程中出错,可以在Activity的Tab下看到错误信息,笔者的错误是因为输入错了gpg密码造成的,导致签名过不去,所以无法close,无法release。

这个步骤在第一篇文章,华为的官方教程中是没有的,也就是最后的10%没告诉你怎么操作。

发布后,可以在Nexus中搜到你的包。

android代码工程转鸿蒙 安卓代码迁移鸿蒙_harmonyos_07

注意坑来了,在点击release的时候,一定更要选中har包,不然会发布成.module后缀的发布包,这也是2.2.1版本无奈产生的原因。

6.最后一步,关闭Jira的Issue

 很多人没有走这一步,所以一直都无法正常发布,当你的一切都弄完了,并不是就自动会给你同步到MavenCenter,如果这么想,那你真是太天真了,需要像我们正常解bug一样,关闭jira的issue:

在Comment里面写上:I have already completed the first release.以及发布包的地址,管理员会去验证,然后帮你同步到MavenCenter。

android代码工程转鸿蒙 安卓代码迁移鸿蒙_android代码工程转鸿蒙_08

 7.总结

 至此,整个发布才算真正完成,这个过程还是比较慢的,而且很繁琐,加上没有完整的入门教程,对一般人不友好,门槛也喊高。期待Jitpack能早点支持,华为可以出一个类似于Jitpack一样的平台,方便快捷的让开发者发布

8.二次提交

笔者移植完ViewModel后,又移植了LiveData,然后依旧重新建立一个 Issue,想着再走一次流程,然而却不用像第一次那么麻烦了,得到了如下对话

android代码工程转鸿蒙 安卓代码迁移鸿蒙_maven_09

他的意思是,不需要再创建Issue了,也不需要在原来的Issue下再评论了,只要你提交到Nexus后,就会自动帮你同步,我验证了下,提交了一个新的库,果然只要把版本号改下,就拉了下来刚提交的库,所以说,maven第一次确实很麻烦,不过后面就非常简单了,只要提交后在Nexus下自己发布就行,因为你已经有了所有权限