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

Voj*_*ěch 17 java interop build maven kotlin

我发现这个关于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>
Run Code Online (Sandbox Code Playgroud)

但是这没有帮助:

[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
Run Code Online (Sandbox Code Playgroud)

线/列恰好指代符号MyKotlinClass.class.即使使用这样的话它也会失败:

System.err.println(MyKotlinClass.class)
Run Code Online (Sandbox Code Playgroud)

yol*_*ole 50

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

这是一个片段,显示混合语言项目的正确配置(取自文档):

<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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。因此,不幸的是,当 Java 和 Kotlin 一起存在时,intellij 似乎无法正确设置 pom 文件。我必须按照文档手动完成此操作。 (4认同)

Chr*_*gue 8

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

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

安卓工作室?偏好...?插件?浏览存储库?在搜索框中输入“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
    }
}
Run Code Online (Sandbox Code Playgroud)

第 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"
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*ean 5

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

我的解决方案是创建一个src/main/kotlinKotlin 类并将其移动到那里,并将我的 Java 文件保留在src/main/java. 但你确实需要 @yole 的答案所示的 Maven 设置。


Far*_*rid 5

如果有人使用 Plain Java 项目而Gradle不是Maven更改模块 gradle 文件,如下所示:

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

apply plugin: 'java-library'
Run Code Online (Sandbox Code Playgroud)

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

apply plugin: 'kotlin'
apply plugin: 'java-library'
Run Code Online (Sandbox Code Playgroud)

原因是

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

正如@yole在答案中所解释的