大家好,好久沒有寫一些文章痕囱,之前經(jīng)歷換工作,適應(yīng)新工作暴匠,最近剛有點時間可以寫一寫鞍恢。正好最近公司項目要把gradle升級到8.x, agp也同步升級,這里記錄一下遇到的一些問題每窖,怎么解決的帮掉。
廢話不多說,這里說一下在升級到gradle8.x之后窒典,項目里之前的maven-publish腳本在執(zhí)行publish命令時報錯了蟆炊,導(dǎo)致沒法打包上傳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")
}
經(jīng)過這樣修改涩搓,就可以正常打包了肩祥,下面就來說說,我是怎么改的缩膝。
1混狠、初次嘗試
當(dāng)我們用最初的腳本執(zhí)行publishXXXPublicationToMavenRepository時,會報下面的錯:
這里提示的錯是指generateMetadataFileForReleasePublication沒有顯式的依賴sourcesJar任務(wù)疾层,但generateMetadataFileForReleasePublication是maven-publish插件添加的将饺,不是我們自定義的任務(wù),沒法直接修改痛黎,只能是用些其他方法予弧,比如在afterEvaluate塊里加上下面的代碼:
tasks.named("generateMetadataFileForReleasePublication").configure {
dependsOn("sourcesJar")
}
這樣修改后,當(dāng)我們再次執(zhí)行publishXXXPublicationToMavenRepository時湖饱,會變成下面的錯誤:
這次怎么就提示我們掖蛤,multiple artifacts with the identical extension and classifier,我們明明沒定義多個artifacts井厌。又經(jīng)過一頓搜索蚓庭,問了gpt后,原來gradle8.0之后仅仆,Java Library插件會自動創(chuàng)建源碼JAR文件器赞,我們之前寫的sourceJars task已經(jīng)不需要了。那好辦墓拜,這次我們直接刪除sourceJars task港柜,artifact sourcesJar這一行代碼也可以刪除了,順便剛剛加的代碼也可以刪除了(繞了一圈剛剛白忙活)咳榜。
2夏醉、再接再厲
經(jīng)過上面一番修改,我們再來執(zhí)行publishXXXPublicationToMavenRepository看看涌韩。如果你的maven倉庫是通過https訪問的畔柔,那這樣應(yīng)該就可以成功了,如果只是通過http訪問贸辈,就又會報如下錯誤:
這里看錯誤提示也很清楚問題原因释树,給出的gradle文檔里也給出了不想換成https訪問的解決方法,我們只需要加上擎淤。allowInsecureProtocol true就可以了奢啥。
repositories {
maven {
allowInsecureProtocol true
url = getRepositoryUrl()
}
}
現(xiàn)在我們再來執(zhí)行publishXXXPublicationToMavenRepository,這次終于成功了嘴拢,maven倉庫上查看桩盲,也已經(jīng)有上傳上來的aar了。
3席吴、完善優(yōu)化
現(xiàn)在我們來看看發(fā)布到maven倉庫的產(chǎn)物里面并沒有帶source源代碼赌结,那豈不是之前刪除sourcesJar是有問題的捞蛋?這倒也不是,畢竟之前就是在排查問題之后才刪除的柬姚,那現(xiàn)在我們應(yīng)該怎么帶上source源代碼呢拟杉,這里我們需要添加的是如下的代碼:
android {
publishing {
singleVariant("release") {
withSourcesJar()
withJavadocJar()
}
}
}
這段代碼邏輯是參照android developer官網(wǎng)給出的例子(https://developer.android.com/build/publish-library/configure-pub-variants?hl=zh-cn),這樣我們就可以將包含源碼JAR文件的發(fā)布產(chǎn)物發(fā)布到Maven倉庫中量承,現(xiàn)在我們再來執(zhí)行一下publishXXXPublicationToMavenRepository搬设,這次發(fā)布的產(chǎn)物里可以看到有source源代碼以及javadoc。大功告成撕捍,讓我們愉快的繼續(xù)gradle升級之旅(踩坑之旅)吧