Java 在为Android工件生成的POM中排除Kotlin stdlib的testImplementation依赖项
鉴于他们的反对,我正在将一个旧的Android库从jcenter迁移到mavenCentral。所有实际的库模块都是用Java编写的,但其中一些模块的测试是用Kotlin编写的 在升级(到AS 4.1.3,Gradle 6.8.3)之前,生成的POM从未包含对Java 在为Android工件生成的POM中排除Kotlin stdlib的testImplementation依赖项,java,android,maven,gradle,Java,Android,Maven,Gradle,鉴于他们的反对,我正在将一个旧的Android库从jcenter迁移到mavenCentral。所有实际的库模块都是用Java编写的,但其中一些模块的测试是用Kotlin编写的 在升级(到AS 4.1.3,Gradle 6.8.3)之前,生成的POM从未包含对kotlin stdlib的编译依赖项。现在看来,应用kotlin android插件会导致生成的POM添加它,即使依赖项包含在testImplementation“org.jetbrains.kotlin:kotlin-stdlib-jd
kotlin stdlib
的编译依赖项。现在看来,应用kotlin android
插件会导致生成的POM添加它,即使依赖项包含在testImplementation“org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.31”中
或者,这真的不是一个好的选择,我应该用Java重写测试吗
值得注意的是,删除kotlin android
插件也会将其作为编译依赖项从POM中删除。它似乎对AAR的产生没有影响;它只是阻止测试运行。将“回答”我自己的问题,如果有任何错误,希望有人纠正我
以前生成的POM是否错误,因为它应该包含kotlin作为编译依赖项,即使它只用于测试
否,kotlin stdlib
不应包含在没有kotlin代码或基于kotlin的依赖项的java/android库发布的POM中
我这样断言是因为我针对这个库的一个版本编译了一个纯java的应用程序,其中从POM中删除了kotlin stdlib
编译条件,并且一切都按预期进行(因为它工作正常)
如果是这样,如果在定义发布时生成POM,如何排除它
定义POM后,可以使用MavenPom插件删除要从生成的POM中排除的依赖节点。e、 g
pom {
licenses { ... }
developers { ... }
scm { ... }
}
pom.withXml {
asNode()
.dependencies
.dependency
.findAll { it.artifactId.text() == "kotlin-stdlib" }
.collect { it.parent().remove(it) }
}
编辑:这不会从生成的module.json
中删除依赖项,因此这现在看起来比以前更错误
相反,您可以检查Gradle Start参数,以确定当前任务请求的目标变量,并且仅当该变量实际包含插件时才应用插件:
def kolinEnabledVariant = getGradle()
.getStartParameter()
.getTaskRequests()
.toString()
.contains("Debug")
if (kolinEnabledVariant) {
apply plugin: 'kotlin-android'
}
评论员注意到变体名称应以大写字母开头
或者,这真的不是一个好的选择,我应该用Java重写测试吗
这就是放弃。自从Kotlin 1.4以来,各种Kotlin Gradle插件自动添加对Kotlin-std的依赖。请参阅 您可以通过添加到
gradle.properties
来禁用它:
kotlin.stdlib.default.dependency=false
我想我最近看到一些关于kotlin java插件自动将kotlin std添加到依赖项的抱怨,也许kotlin android插件也会这样做。应该有一个选项来禁用自动添加依赖项。您可能需要检查文档。也许就是这样:@markrotterveel
kotlin.stdlib.default.dependency=false
完全符合我的要求,谢谢。如果你再发一次谢谢,我会接受你的回答!
def kolinEnabledVariant = getGradle()
.getStartParameter()
.getTaskRequests()
.toString()
.contains("Debug")
if (kolinEnabledVariant) {
apply plugin: 'kotlin-android'
}
kotlin.stdlib.default.dependency=false