升級gradle8.x 打包上傳aar怎么就失效了

大家好,好久沒有寫一些文章,之前經歷換工作,適應新工作,最近剛有點時間可以寫一寫。正好最近公司項目要把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時,會報下面的錯:


初次嘗試.png

這里提示的錯是指generateMetadataFileForReleasePublication沒有顯式的依賴sourcesJar任務,但generateMetadataFileForReleasePublication是maven-publish插件添加的,不是我們自定義的任務,沒法直接修改,只能是用些其他方法,比如在afterEvaluate塊里加上下面的代碼:

    tasks.named("generateMetadataFileForReleasePublication").configure {
        dependsOn("sourcesJar")
    }

這樣修改后,當我們再次執行publishXXXPublicationToMavenRepository時,會變成下面的錯誤:


初次嘗試2.png

這次怎么就提示我們,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訪問,就又會報如下錯誤:


再接再厲.png

這里看錯誤提示也很清楚問題原因,給出的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升級之旅(踩坑之旅)吧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容