这里首先吐槽一下,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不能随便写,这点它没有详细说,所以笔者这里展开说下:
这个红色圈出来的就是GroupID,如果你是托管在Gitee上或者Github上,需要遵守一个命名规则:
如果你是自己的网站,你需要在自己的网页写个重定向,可以让你的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的东西了,和鸿蒙没关系了再看你也看不懂了。
图中这步骤,就不要看了。
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
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.上传
只有Gradle里面写了apply for upload.gradle,点击之后,就可以上传了,一般上传可能出错,就是配置里面的gpg的keyid,密码,maven的用户名和密码写错了,这点特别注意然后,你就可以在Nexus Manager里面看到你提交的了。
4.操作Nexus
//上传成功后:https://s01.oss.sonatype.org/#stagingRepositories
访问这个地址,可以看到你上传的
笔者一开始的版本是2.2.0,尝试了几次,一直报错,所以留着了,把版本改成2.2.1发布了,2.2.0留着提醒自己错误的原因。
如果上传成功后,可以在这个页面一次点击1234,3就是说关闭这次Issue,4就是把它发布,放到release目录下去,当然如果过程中出错,可以在Activity的Tab下看到错误信息,笔者的错误是因为输入错了gpg密码造成的,导致签名过不去,所以无法close,无法release。
这个步骤在第一篇文章,华为的官方教程中是没有的,也就是最后的10%没告诉你怎么操作。
发布后,可以在Nexus中搜到你的包。
注意坑来了,在点击release的时候,一定更要选中har包,不然会发布成.module后缀的发布包,这也是2.2.1版本无奈产生的原因。
6.最后一步,关闭Jira的Issue
很多人没有走这一步,所以一直都无法正常发布,当你的一切都弄完了,并不是就自动会给你同步到MavenCenter,如果这么想,那你真是太天真了,需要像我们正常解bug一样,关闭jira的issue:
在Comment里面写上:I have already completed the first release.以及发布包的地址,管理员会去验证,然后帮你同步到MavenCenter。
7.总结
至此,整个发布才算真正完成,这个过程还是比较慢的,而且很繁琐,加上没有完整的入门教程,对一般人不友好,门槛也喊高。期待Jitpack能早点支持,华为可以出一个类似于Jitpack一样的平台,方便快捷的让开发者发布
8.二次提交
笔者移植完ViewModel后,又移植了LiveData,然后依旧重新建立一个 Issue,想着再走一次流程,然而却不用像第一次那么麻烦了,得到了如下对话
他的意思是,不需要再创建Issue了,也不需要在原来的Issue下再评论了,只要你提交到Nexus后,就会自动帮你同步,我验证了下,提交了一个新的库,果然只要把版本号改下,就拉了下来刚提交的库,所以说,maven第一次确实很麻烦,不过后面就非常简单了,只要提交后在Nexus下自己发布就行,因为你已经有了所有权限