大家好,好久沒有寫一些文章,之前經歷換工作,適應新工作,最近剛有點時間可以寫一寫。正好最近公司項目要把gradle升級到8.x, agp也同步升級,這里記錄一下遇到的一些問題,怎么解決的。
廢話不多說,這里說一下在升級到gradle8.x之后,項目里之前的maven-publish腳本在執行publish命令時報錯了,導致沒法打包上傳aar。之前我們的publish腳本是這樣的:
apply plugin: 'maven-publish'
def isReleaseBuild() {
return !VERSION_NAME.toUpperCase().contains("SNAPSHOT")
}
def getRepositoryUrl() {
return isReleaseBuild() ? RELEASE_REPOSITORY_URL : SNAPSHOT_REPOSITORY_URL
}
//生成源碼jar包task
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
archiveClassifier.set("sources")
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
artifact sourcesJar
groupId = GROUP
artifactId = ARTIFACT_ID
version = VERSION_NAME
}
}
repositories {
maven {
url = getRepositoryUrl()
}
}
}
}
省流,這里直接給出修改后的打包腳本:
apply plugin: 'maven-publish'
android {
publishing {
singleVariant("release") {
withSourcesJar()
withJavadocJar()
}
}
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
groupId = GROUP
artifactId = ARTIFACT_ID
version = VERSION_NAME
}
}
repositories {
maven {
allowInsecureProtocol true
url = getRepositoryUrl()
}
}
}
}
def getRepositoryUrl() {
return isReleaseBuild() ? RELEASE_REPOSITORY_URL : SNAPSHOT_REPOSITORY_URL
}
def isReleaseBuild() {
return !VERSION_NAME.toUpperCase().contains("SNAPSHOT")
}
經過這樣修改,就可以正常打包了,下面就來說說,我是怎么改的。
1、初次嘗試
當我們用最初的腳本執行publishXXXPublicationToMavenRepository時,會報下面的錯:
這里提示的錯是指generateMetadataFileForReleasePublication沒有顯式的依賴sourcesJar任務,但generateMetadataFileForReleasePublication是maven-publish插件添加的,不是我們自定義的任務,沒法直接修改,只能是用些其他方法,比如在afterEvaluate塊里加上下面的代碼:
tasks.named("generateMetadataFileForReleasePublication").configure {
dependsOn("sourcesJar")
}
這樣修改后,當我們再次執行publishXXXPublicationToMavenRepository時,會變成下面的錯誤:
這次怎么就提示我們,multiple artifacts with the identical extension and classifier,我們明明沒定義多個artifacts。又經過一頓搜索,問了gpt后,原來gradle8.0之后,Java Library插件會自動創建源碼JAR文件,我們之前寫的sourceJars task已經不需要了。那好辦,這次我們直接刪除sourceJars task,artifact sourcesJar這一行代碼也可以刪除了,順便剛剛加的代碼也可以刪除了(繞了一圈剛剛白忙活)。
2、再接再厲
經過上面一番修改,我們再來執行publishXXXPublicationToMavenRepository看看。如果你的maven倉庫是通過https訪問的,那這樣應該就可以成功了,如果只是通過http訪問,就又會報如下錯誤:
這里看錯誤提示也很清楚問題原因,給出的gradle文檔里也給出了不想換成https訪問的解決方法,我們只需要加上。allowInsecureProtocol true就可以了。
repositories {
maven {
allowInsecureProtocol true
url = getRepositoryUrl()
}
}
現在我們再來執行publishXXXPublicationToMavenRepository,這次終于成功了,maven倉庫上查看,也已經有上傳上來的aar了。
3、完善優化
現在我們來看看發布到maven倉庫的產物里面并沒有帶source源代碼,那豈不是之前刪除sourcesJar是有問題的?這倒也不是,畢竟之前就是在排查問題之后才刪除的,那現在我們應該怎么帶上source源代碼呢,這里我們需要添加的是如下的代碼:
android {
publishing {
singleVariant("release") {
withSourcesJar()
withJavadocJar()
}
}
}
這段代碼邏輯是參照android developer官網給出的例子(https://developer.android.com/build/publish-library/configure-pub-variants?hl=zh-cn),這樣我們就可以將包含源碼JAR文件的發布產物發布到Maven倉庫中,現在我們再來執行一下publishXXXPublicationToMavenRepository,這次發布的產物里可以看到有source源代碼以及javadoc。大功告成,讓我們愉快的繼續gradle升級之旅(踩坑之旅)吧