@@ -23,43 +23,43 @@ Kotlin是一门JVM语言, 可以自由的调用Java中的所有库功能, 这
先来看一个编译示例。
{% oss_image kotlin-unresolve-reference/error-prompt.png CAEQDxiBgIDvldfdyRciIDZiZGVmMDIzMjZhODQwZDRhOTViMGRjNzg3ZDc1ODcz 编译示例 450 %}
{% oss_image kotlin-unresolve-reference/error-prompt.png 编译示例 450 %}
一个项目在使用`./gradlew run` 构建运行的时候报出了`Unresovled reference: readString` 错误。这个`readString` 是调用的`java.nio.file.Files.readString()` 方法。可是为什么会报这个方法没有找到呢?先来看一下这个方法的文档信息。
{% oss_image kotlin-unresolve-reference/file-docs.png CAEQDxiBgMDMlNfdyRciIGZlM2M5OTY3NTQ0NzRhZTNiMmY2N2FmNGVhYjcyYTdk 文档信息 450 %}
{% oss_image kotlin-unresolve-reference/file-docs.png 文档信息 450 %}
好吧, 有点儿长, 但是似乎看不出什么端倪来。这里要注意了, 这个方法是在Java 11引入的, 那我们来看看项目的构建配置。
{% oss_image kotlin-unresolve-reference/gradle-file.png CAEQDxiBgMDSk9fdyRciIGIyMGExYWE5YWVmYzRiZjVhYzM2ZGVlMTI1OTI0ZjIw Gradle构建配置 300 %}
{% oss_image kotlin-unresolve-reference/gradle-file.png Gradle构建配置 300 %}
Kotlin的编译目标看起来也没有什么问题, 同样是面向Java 11编译的, 理论上使用这个新引入的方法完全没有问题。那么, 再来看看IDE中的项目配置。
{% oss_image kotlin-unresolve-reference/ide-setting.png CAEQDxiBgMDXk9fdyRciIDkyZGMwODRmYjJiMjQyYjBhMTZhZDQyZGI2Mzc4ZWY5 IDE项目配置 450 %}
{% oss_image kotlin-unresolve-reference/ide-setting.png IDE项目配置 450 %}
好, 项目配置这里依旧没有问题。那么Gradle构建Kotlin项目所所涉及到的两个JDK版本问题就已经确认了一个了。那么我们来看另一个JDK配置。
{% oss_image kotlin-unresolve-reference/system-setting.png CAEQDxiBgMCLlNfdyRciIDQxYzZmMTA1MGU5NTQzMzI5YmNlN2Q3ZmNhODkwOTc0 系统JDK 450 %}
{% oss_image kotlin-unresolve-reference/system-setting.png 系统JDK 450 %}
呃, 好吧, 我机器上的Java是通过SDKMan安装的, 这里安利一下, 真的很好用, Windows用户就暂时不要想了。不过`JAVA_HOME` 也是Java 11, 这就尴尬了好不。不过不用急, 能够影响Gradle所使用的JVM的还有一处位置, 那就是用户家目录下的`.gradle` 目录, 这是Gradle保存全局配置的目录, 这个目录里有一个用于配置Gradle的`gradle.properties` 文件。
{% oss_image kotlin-unresolve-reference/gradle-setting.png CAEQDxiBgICBltfdyRciIGNkYWQwMWRjMWQ3NjQ3ZjJiNDQ3YjY5M2ZiNDZkY2I0 'Gradle JDK' 500 %}
{% oss_image kotlin-unresolve-reference/gradle-setting.png 'Gradle JDK' 500 %}
看起来我们似乎找到了问题的源头, Gradle没有在使用环境变量中配置的`JAVA_HOME` ,而是使用了`.gradle/grade.properties` 中另行指定的JDK目录。那么修改它一下试试。
{% oss_image kotlin-unresolve-reference/gradle-setting-modified.png CAEQDxiBgMCHlNfdyRciIDI4OGIxYjZjYjIxODQxZjU5MWMxNzllNjlkOTlmODhh 'Gradle JDK 修改后' 500 %}
{% oss_image kotlin-unresolve-reference/gradle-setting-modified.png 'Gradle JDK 修改后' 500 %}
现在我们再来试一下吧。
{% oss_image kotlin-unresolve-reference/second-test-run.png CAEQDxiBgID7ldfdyRciIGEzYmUwNjk5MmJiYzQ3NjM5MzhlZmMyOTgxYmE4MzA4 第二次实验运行 350 %}
{% oss_image kotlin-unresolve-reference/second-test-run.png 第二次实验运行 350 %}
呃, 看起来依旧好尴尬, 问题依旧。那么能够配置Gradle所使用的JVM的位置还有没有呢? 这个位置还真的还有一个, 那就是IDE中的配置。
{% oss_image kotlin-unresolve-reference/ide-gradle-setting.png CAEQDxiBgMDXk9fdyRciIDkyZGMwODRmYjJiMjQyYjBhMTZhZDQyZGI2Mzc4ZWY5 修改IDE中的Gradle配置 450 %}
{% oss_image kotlin-unresolve-reference/ide-gradle-setting.png 修改IDE中的Gradle配置 450 %}
IDE中配置Gradle使用的是Java 8, 那么把这里也修改成Java 11试试看。
{% oss_image kotlin-unresolve-reference/third-test-run.png CAEQDxiBgIDLk9fdyRciIGQyMDJiZDNkY2RmYjRlNDFiZjFiOGQzOWMyOTYzYjJi 成功运行 350 %}
{% oss_image kotlin-unresolve-reference/third-test-run.png 成功运行 350 %}
至此, 由于Gradle所使用的JVM配置错误而导致Kotlin发生“Unresolved reference”的问题已经全部解决。这个问题是由于Gradle使用的JVM是Java 8, 其中并不带有项目中所使用的Java 11的内容, 而Gradle所使用的JVM又是项目编译所要使用的JVM, 这就导致了Kotlin报出“Unresolved reference”错误。