Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在为Android工件生成的POM中排除Kotlin stdlib的testImplementation依赖项_Java_Android_Maven_Gradle - Fatal编程技术网

Java 在为Android工件生成的POM中排除Kotlin stdlib的testImplementation依赖项

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

鉴于他们的反对,我正在将一个旧的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-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