在 Java 中使用 Kotlin 类:找不到符号
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/43980110/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using Kotlin class in Java: Cannot find symbol
提问by Vojtěch
I have found thissimilar question regarding Android, but I am using plain Java with Maven as build tool. I think it is better to post a new question.
我发现了这个关于 Android 的类似问题,但我使用纯 Java 和 Maven 作为构建工具。我认为最好发布一个新问题。
I have created a Kotlin class to which I am trying to refer from Java class as MyKotlinClass.class
. The Maven build fails, whereas compilation in IntelliJ Idea works fine. I have already added Kotlin plugin to maven:
我创建了一个 Kotlin 类,我试图从 Java 类中将其引用为MyKotlinClass.class
. Maven 构建失败,而 IntelliJ Idea 中的编译工作正常。我已经在 maven 中添加了 Kotlin 插件:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
However that does not help:
但是,这无济于事:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project app: Compilation failure
[ERROR] MyClassLinkingKotlin.java:[100,40] error: cannot find symbol
The line/column exactly refers to symbol MyKotlinClass.class
. It will fail even when using like this:
行/列准确地指代符号MyKotlinClass.class
。即使这样使用它也会失败:
System.err.println(MyKotlinClass.class)
回答by yole
Your Maven configuration adds the Kotlin compiler plugin, but doesn't adjust the Java compiler plugin execution so that the Java compiler runs after the Kotlin compiler. Therefore, the Java compiler runs before Kotlin, and doesn't see Kotlin-compiled classes.
您的 Maven 配置添加了 Kotlin 编译器插件,但不会调整 Java 编译器插件的执行,以便 Java 编译器在 Kotlin 编译器之后运行。因此,Java 编译器在 Kotlin 之前运行,并且看不到 Kotlin 编译的类。
Here's a snippet showing the correct configuration for a mixed-language project (taken from the documentation):
这是显示混合语言项目的正确配置的片段(取自文档):
<build>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<executions>
<!-- Replacing default-compile as it is treated specially by maven -->
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<!-- Replacing default-testCompile as it is treated specially by maven -->
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
<execution>
<id>java-compile</id>
<phase>compile</phase>
<goals> <goal>compile</goal> </goals>
</execution>
<execution>
<id>java-test-compile</id>
<phase>test-compile</phase>
<goals> <goal>testCompile</goal> </goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
回答by Sean
I ran into this same error, but had the correct pom setup. My issue was that I had just converted a Java class to a Kotlin class with Intellij, which left that Kotlin file in src/main/java
.
我遇到了同样的错误,但有正确的 pom 设置。我的问题是我刚刚使用 Intellij 将 Java 类转换为 Kotlin 类,这将 Kotlin 文件保留在src/main/java
.
The solution for me was to create a src/main/kotlin
and move my Kotlin class there, and leave my Java files in src/main/java
. But you do definitely need the maven setup that @yole's answer shows.
我的解决方案是创建一个src/main/kotlin
并将我的 Kotlin 类移到那里,并将我的 Java 文件保留在src/main/java
. 但是您确实需要@yole 的答案显示的 Maven 设置。
回答by Chris Sprague
If you are using Android Studio and have already added the Kotlin plugins via Settings -> Plugins -> Kotlin, then it could be that you haven't setup the rest of Gradle to use Kotlin. Here's a snippet from https://medium.com/@elye.project/setup-kotlin-for-android-studio-1bffdf1362e8:
如果您使用的是 Android Studio 并且已经通过设置 -> 插件 -> Kotlin 添加了 Kotlin 插件,那么可能是您尚未将 Gradle 的其余部分设置为使用 Kotlin。这是来自https://medium.com/@elye.project/setup-kotlin-for-android-studio-1bffdf1362e8的片段:
Step 1: Setup the Kotlin Plugin in Android Studio
第 1 步:在 Android Studio 中设置 Kotlin 插件
Android Studio → Preferences… →Plugins → Browse Repository → type “Kotlin” in search box → install
Android Studio → Preferences… →Plugins → Browse Repository → 在搜索框中输入“Kotlin” → 安装
Step 2: Add Kotlin classpath to project Build.Gradle
第 2 步:将 Kotlin 类路径添加到项目 Build.Gradle
buildscript {
ext.kotlin_version = "1.1.1"
ext.supportLibVersion = "25.3.0"
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
Step 3: Add Kotlin library and apply Kotlin Plugins in your module Build.gradle
第 3 步:添加 Kotlin 库并在您的模块 Build.gradle 中应用 Kotlin 插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
// ... various gradle setup
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile "com.android.support:appcompat-v7:$supportLibVersion"
compile "com.android.support:recyclerview-v7:$supportLibVersion"
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}