gradle 在生成的POM for Android工件中排除Kotlinstdlib的testImplementation依赖项

sxpgvts3  于 2023-01-31  发布在  Android
关注(0)|答案(2)|浏览(266)

我正在将一个旧的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没有影响;它只会阻止测试运行。

y4ekin9u

y4ekin9u1#

从Kotlin1.4开始,各种Kotlin Gradle插件会自动添加对kotlin-std的依赖关系。
您可以通过添加到gradle.properties来禁用它:

kotlin.stdlib.default.dependency=false
pvabu6sv

pvabu6sv2#

去"回答"我自己的问题,希望有人纠正我,如果有什么不对的。
之前生成的POM是否有错误,它应该将kotlin作为编译依赖项包括在内,尽管它只用于测试?
不可以,kotlin-stdlib不应该包含在没有kotlin代码或基于kotlin的依赖项的java/android库的发布发布的POM中。
我之所以做出这样的Assert,是因为我已经针对这个库的一个版本编译了一个纯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重写测试吗?
那是放弃。

相关问题