Gradle Kotlin DSL无法找到java.io包。

13

我正在尝试将Android应用程序的build.gradle文件转换为Kotlin DSL。这个文件有一个类似于以下的函数:

def getLastCommitHash() {
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

我将其转换为这样:

fun getLastCommitHash() {
    val stdout = ByteArrayOutputStream()
    exec {
        commandLine("git", "rev-parse", "--short", "HEAD")
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

我遇到了一个Unresolved reference: ByteArrayOutputStream错误,应用变更为java.io.ByteArrayOutputStream()的导入会显示一个Unresolved reference: io错误。

我做错了什么吗? 预先感谢。


在找到一个几乎相同的函数并将其转换后,我遇到了相同的问题,这个函数在这个答案中。因为提出了我所遇到的确切问题而被点赞。 - Pilot_51
3
在Gradle/Kotlin中,Java值会遮盖包名,这使得从java.*导入任何内容几乎不可能。这个问题的答案将回答“在Kotlin中,当Java值被变量遮蔽时,你如何引用Java包名?” - Ryan Leach
4个回答

9

plugins块之前导入java.io可以正常工作。我使用以下的build.gradle.kts成功地运行了Gradle 7.3.2和6.9.2的构建:

import java.io.ByteArrayOutputStream

plugins {
    `java-library`
}

println(ByteArrayOutputStream::class)

如果你转义完整的包名,那么你也可以在不导入类的情况下使其正常工作(如上所述已测试):

plugins {
    `java-library`
}

println(`java.security`.MessageDigest::class)

最初对我来说有些奇怪的是,IntelliJ似乎不愿将导入添加到build.gradle.kts中,并且它会用警告突出显示导入。尽管我现在似乎无法再现这个问题。(我的问题与java.security.MessageDigest有关)这也是我最终得出的解决方案,但仍让我想知道是否有任何方法可以避免引用长名称时的阴影。 - Ryan Leach
我相信我找到了一种方法,请查看我的更新答案。 - Chriki

6

我在IntelliJ IDEA后端项目中遇到了这个问题,我在build.gradle文件的顶部添加了以下导入:

import java.io.ByteArrayOutputStream

现在它可以正常工作了。


这似乎不适用于 build.gradle.kts,也就是 Kotlin,就像问题所问的那样。 - Ryan Leach

2

我的观察:

  • 关闭项目
  • 删除 .idea.gradle 文件夹
  • 通过选择根目录下的 build.gradle.kts 文件并使用 "open as project" 打开项目

确实有帮助。


1

这是与Android Studio 3.5.6有关的问题。升级到Android Studio 3.6后,一切都正常运行。


1
我遇到了这个问题,它不是在Android Studio中出现的,而是在IntelliJ中。 - Ryan Leach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接