【问题标题】:Excluding testImplementation dependency for Kotlin stdlib in generated POM for Android artifact在为 Android 工件生成的 POM 中排除 Kotlin stdlib 的 testImplementation 依赖项
【发布时间】:2021-03-29 03:56:29
【问题描述】:

鉴于旧版 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"

  <dependencies>
    <dependency>
      <groupId>org.jetbrains.kotlin</groupId>
      <artifactId>kotlin-stdlib</artifactId>
      <version>1.4.31</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

问题:之前生成的 POM 是否错误,因为它应该包含 kotlin 作为编译依赖项,即使它仅用于测试?

或者,在这种特定情况下,我是否必须做一些特别的事情来排除“依赖”?如果是这样,如果在定义出版物时生成 POM,我怎么能排除它:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                ....

                pom {
                    name = ...
                    licenses { }
                    developers { }
                    scm { }
                }
            }
        }
    }
}

或者,这不是一个很好的选择,我应该用 Java 重写测试吗?

值得注意的是,删除 kotlin-android 插件也会将其作为编译依赖项从 POM 中删除。它似乎对生成 AAR 没有影响;它只是阻止测试运行。

【问题讨论】:

  • 我想我最近看到一些关于 kotlin-java 插件自动将 kotlin-std 添加到依赖项的投诉,也许 kotlin-android 插件也是如此。应该有一个选项来禁用这种自动添加依赖项。您可能需要查看文档。也许就是这样:kotlinlang.org/docs/…
  • @MarkRotteveel kotlin.stdlib.default.dependency=false 正是 我的要求,谢谢。如果您发布它,我会接受它作为答案

标签: java android maven gradle


【解决方案1】:

从 Kotlin 1.4 开始,各种 Kotlin Gradle 插件会自动添加对 kotlin-std 的依赖。见Dependency on the standard library

您可以通过添加gradle.properties来禁用它:

kotlin.stdlib.default.dependency=false

【讨论】:

  • 再次感谢您!
【解决方案2】:

打算“回答”我自己的问题,如果有任何问题,希望有人纠正我。

之前生成的 POM 是否有错误,因为它应该包含 kotlin 作为编译依赖项,即使它仅用于测试?

不,kotlin-stdlib 不应包含在没有 kotlin 代码或基于 kotlin 的依赖项的 java/android 库的发布发布的 POM 中。

我做出这个断言是因为我已经针对这个库的一个版本编译了一个仅限 java 的应用程序,其中 kotlin-stdlib 编译条件已从 POM 中删除,并且一切都按预期运行(因为它有效)。

如果是这样,如果在定义发布时生成 POM,我该如何排除它

定义你的 POM 后,你可以使用 MavenPom 插件中的pom.withXml 来删除你想要从生成的 POM 中排除的依赖节点。例如

pom {
    licenses { ... }
    developers { ... }
    scm { ... }
}

pom.withXml {
    asNode()
        .dependencies
        .dependency
        .findAll { it.artifactId.text() == "kotlin-stdlib" }
        .collect { it.parent().remove(it) }
}

编辑:这不会从生成的module.json 中删除依赖项,因此现在看起来比以前感觉更错误。

相反,您可以检查 Gradle 启动参数以确定当前任务请求所针对的变体,并且仅在变体应实际包含插件时应用插件:

def kolinEnabledVariant = getGradle()
        .getStartParameter()
        .getTaskRequests()
        .toString()
        .contains("Debug")

if (kolinEnabledVariant) {
    apply plugin: 'kotlin-android'
}

related answer 上的评论者请注意,变体名称应以大写字母开头。

或者,这不是一个很好的选择,我应该用 Java 重写测试吗?

那就放弃了。

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 2018-04-12
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2022-06-16
    相关资源
    最近更新 更多