在 Java 中使用 Kotlin 类:找不到符号

Posted

技术标签:

【中文标题】在 Java 中使用 Kotlin 类:找不到符号【英文标题】:Using Kotlin class in Java: Cannot find symbol 【发布时间】:2017-10-14 06:36:09 【问题描述】:

我发现this 与 android 相关的类似问题,但我使用纯 Java 和 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>

但这无济于事:

[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

行/列正好指代符号MyKotlinClass.class。即使这样使用也会失败:

System.err.println(MyKotlinClass.class)

【问题讨论】:

请告诉我们MyClassLinkingKotlin.java 特别是第 100 行(我认为是 [line,col]) 已添加到问题中。 Error trying to instantiate a Kotlin class from Java的可能重复 【参考方案1】:

您的 Maven 配置添加了 Kotlin 编译器插件,但没有调整 Java 编译器插件的执行,以便 Java 编译器在 Kotlin 编译器之后运行。因此,Java 编译器在 Kotlin 之前运行,并且看不到 Kotlin 编译的类。

这是一个显示混合语言项目正确配置的 sn-p(取自 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>

【讨论】:

谢谢。因此,不幸的是,当 Java 和 Kotlin 一起使用时,intellij 似乎没有正确设置 pom 文件。我必须按照文档手动完成。【参考方案2】:

如果您使用的是 Android Studio,并且已经通过 Settings -> Plugins -> Kotlin 添加了 Kotlin 插件,那么可能是您尚未设置 Gradle 的其余部分以使用 Kotlin。这是来自https://medium.com/@elye.project/setup-kotlin-for-android-studio-1bffdf1362e8的sn-p:

第 1 步:在 Android Studio 中设置 Kotlin 插件

Android Studio → Preferences... →Plugins → Browse Repository → 输入 搜索框中的“Kotlin” → 安装

第 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
    

第 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"

【讨论】:

【参考方案3】:

我遇到了同样的错误,但 pom 设置正确。我的问题是我刚刚使用 Intellij 将 Java 类转换为 Kotlin 类,这将 Kotlin 文件留在了src/main/java

我的解决方案是创建一个 src/main/kotlin 并将我的 Kotlin 类移到那里,并将我的 Java 文件留在 src/main/java 中。但是您确实需要@yole 的回答显示的 Maven 设置。

【讨论】:

只是好奇:为什么这行得通是因为在 Kotlin 文件移动到 src/main/kotlin 之后,它们在 Java 文件之前编译?这就是它的工作原理?【参考方案4】:

如果有人使用带有Gradle 而不是Maven 的普通Java 项目,请按如下方式更改您的模块gradle 文件:

假设你的模块中有以下插件:

apply plugin: 'java-library'

如果你想拥有 kotlin 插件,那么在 java 插件之前添加 kotlin 插件:

apply plugin: 'kotlin'
apply plugin: 'java-library'

原因是

您的配置添加了 Kotlin 编译器插件,但没有调整 Java 编译器插件执行,以便 Java 编译器运行 在 Kotlin 编译器之后。因此,Java 编译器在运行之前 Kotlin,并且没有看到 Kotlin 编译的类。

正如@yole 在答案中解释的那样

【讨论】:

以上是关于在 Java 中使用 Kotlin 类:找不到符号的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 类的 Android 单元测试因“找不到符号类...”而失败

使用java的jar包默认类提示找不到符号

java中提示找不到符号

java 中 “找不到符号”的错误

java package找不到符号

java 中总是出现找不到符号 是怎么回事