Gradle发布版本目录至Nexus报错:NoSuchAlgorithmException
问题:Gradle版本目录发布至Nexus仓库时出现NoSuchAlgorithmException错误
执行gradlew publish命令发布Gradle版本目录到Nexus仓库时,抛出java.security.NoSuchAlgorithmException错误,无法完成发布。但将仓库改为mavenLocal()时,版本目录可正常发布至本地Maven仓库。
另外,配置完全一致的自定义Gradle插件能成功发布到同一Nexus仓库,添加堆栈跟踪后发现错误由SSLContext.getDefault()抛出。
版本目录发布脚本(原错误脚本)
buildscript { dependencies { classpath("com.android.tools.build:gradle:7.2.0") } } plugins { id ("version-catalog") id ("maven-publish") } catalog { versionCatalog { from(files("gradle/libs.versions.toml")) } } publishing { publications { create<MavenPublication>("VersionCatalog") { groupId = "com.phinneyridge" artifactId = "com.phinneyridge.version.catalog" version = "1.0.0" from(components["versionCatalog"]) } repositories { maven { name = "PhinneyRidgeRepository" url = uri(System.getenv()["PhinneyRidgeReleaseRepoUrl"].toString()) credentials { username = System.getenv().get("PhinneyRidgeRepoUser").toString() password = System.getenv().get("PhinneyRidgeRepoUserPW").toString() } println(url) println(credentials.username + ":" + credentials.password) } } } }
可正常发布的Gradle插件脚本
plugins { id ("java-gradle-plugin") "java-library" id ("maven-publish") id("com.gradle.plugin-publish") version "0.20.0" id("org.jetbrains.kotlin.jvm") version "1.6.20" id("org.gradle.kotlin.kotlin-dsl") version "2.1.7" } gradlePlugin { group = "com.phinneyridge" plugins { create("PhinneyRidgePlugin") { id = "com.phinneyridge.project" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeProjectPlugin" } create("PhinneyRidgeAndroidAppPlugin") { id = "com.phinneyridge.android.application" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeAndroidAppPlugin" } create("PhinneyRidgeAndroidLibPlugin") { id = "com.phinneyridge.android.library" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeAndroidLibPlugin" } create("PhinneyRidgeAndroidKotlinAppPlugin") { id = "com.phinneyridge.android.kotlin.application" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeAndroidKotlinAppPlugin" } create("PhinneyRidgeAndroidKotlinLibPlugin") { id = "com.phinneyridge.android.kotlin.library" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeAndroidKotlinLibPlugin" } create("PhinneyRidgeJavaAppPlugin") { id = "com.phinneyridge.java.application" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeJavaAppPlugin" } create("PhinneyRidgeJavaLibPlugin") { id = "com.phinneyridge.java.library" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeJavaLibPlugin" } create("PhinneyRidgeJavaKotlinAppPlugin") { id = "com.phinneyridge.java.kotlin.application" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeJavaKotlinAppPlugin" } create("PhinneyRidgeJavaKotlinLibPlugin") { id = "com.phinneyridge.java.kotlin.library" implementationClass = "com.phinneyridge.android.gradle.PhinneyRidgeJavaKotlinLibPlugin" } create("PhinneyRidgeDSAnnotations") { id = "com.phinneyridge.dsannotations" implementationClass = "com.phinneyridge.osgi.DSAnnotations" } create("Aar2Jar") { id = "com.phinneyridge.aar2jar" implementationClass = "com.phinneyridge.android.Aar2Jar" } } } group = "com.phinneyridge" version = "1.0.0" publishing { repositories { maven { url = uri(System.getenv().get("PhinneyRidgeReleaseRepoUrl").toString()) credentials { username = System.getenv().get("PhinneyRidgeRepoUser").toString() password = System.getenv().get("PhinneyRidgeRepoUserPW").toString() } } } } dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) gradleApi(); implementation ("com.android.tools.build:gradle:7.1.3") implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20") }
原因分析
- 版本目录发布脚本中,
repositories块被错误嵌套在publications内部,Gradle处理时会出现配置上下文异常,当连接HTTPS的Nexus仓库时,异常会触发SSL上下文初始化失败,进而抛出NoSuchAlgorithmException。 - 本地Maven仓库不需要SSL加密连接,所以错误配置不会暴露;而插件脚本的
repositories是正确放在publishing根级别下,与publications同级,因此能正常发布。
解决办法
修改版本目录发布脚本,将repositories块从publications内部移出,放在publishing根级别,与publications同级:
修改后的版本目录发布脚本
buildscript { dependencies { classpath("com.android.tools.build:gradle:7.2.0") } } plugins { id ("version-catalog") id ("maven-publish") } catalog { versionCatalog { from(files("gradle/libs.versions.toml")) } } publishing { publications { create<MavenPublication>("VersionCatalog") { groupId = "com.phinneyridge" artifactId = "com.phinneyridge.version.catalog" version = "1.0.0" from(components["versionCatalog"]) } } // 将repositories移到publications外部,与publications同级 repositories { maven { name = "PhinneyRidgeRepository" url = uri(System.getenv()["PhinneyRidgeReleaseRepoUrl"].toString()) credentials { username = System.getenv().get("PhinneyRidgeRepoUser").toString() password = System.getenv().get("PhinneyRidgeRepoUserPW").toString() } println(url) println(credentials.username + ":" + credentials.password) } } }
修改后重新执行gradlew publish命令即可正常发布版本目录到Nexus仓库。
内容的提问来源于stack exchange,提问作者Tom Rutchik
相关产品推荐
相关产品推荐

