Verwendung der Kotlin-Klasse in Java: Symbol kann nicht gefunden werden

Lesezeit: 5 Minuten

Benutzer-Avatar
Vojtěch

Ich habe diese ähnliche Frage zu Android gefunden, aber ich verwende einfaches Java mit Maven als Build-Tool. Ich denke, es ist besser, eine neue Frage zu stellen.

Ich habe eine Kotlin-Klasse erstellt, auf die ich von der Java-Klasse verweisen möchte MyKotlinClass.class. Der Maven-Build schlägt fehl, während die Kompilierung in IntelliJ Idea gut funktioniert. Ich habe das Kotlin-Plugin bereits zu Maven hinzugefügt:

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

Das hilft aber nicht:

[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

Die Zeile/Spalte bezieht sich genau auf das Symbol MyKotlinClass.class. Es wird auch bei folgender Verwendung fehlschlagen:

System.err.println(MyKotlinClass.class)

  • Bitte zeigen Sie uns MyClassLinkingKotlin.java insbesondere Zeile 100 (ich denke, es ist [line,col])

    – Wurflöffel

    15. Mai 2017 um 12:56 Uhr

  • Zur Frage hinzugefügt.

    – Vojtěch

    15. Mai 2017 um 12:58 Uhr


  • Mögliches Duplikat von Fehler beim Versuch, eine Kotlin-Klasse aus Java zu instanziieren

    – Ilja

    15. Mai 2017 um 23:04 Uhr

Ihre Maven-Konfiguration fügt das Kotlin-Compiler-Plugin hinzu, passt die Ausführung des Java-Compiler-Plugins jedoch nicht so an, dass der Java-Compiler nach dem Kotlin-Compiler ausgeführt wird. Daher wird der Java-Compiler vor Kotlin ausgeführt und sieht keine von Kotlin kompilierten Klassen.

Hier ist ein Ausschnitt, der die korrekte Konfiguration für ein gemischtsprachiges Projekt zeigt (entnommen aus die Dokumentation):

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

  • Vielen Dank. Leider scheint intellij die pom-Datei nicht korrekt einzurichten, wenn Java und Kotlin zusammen vorhanden sind. Ich musste es manuell tun, indem ich der Dokumentation folgte.

    – Ferran Maylinch

    22. Januar 2020 um 7:21 Uhr


Wenn Sie Android Studio verwenden und die Kotlin-Plugins bereits über Einstellungen -> Plugins -> Kotlin hinzugefügt haben, kann es sein, dass Sie den Rest von Gradle nicht für die Verwendung von Kotlin eingerichtet haben. Hier ein Ausschnitt aus https://medium.com/@elye.project/setup-kotlin-for-android-studio-1bffdf1362e8:

Schritt 1: Richten Sie das Kotlin-Plugin in Android Studio ein

Android Studio → Einstellungen … → Plugins → Repository durchsuchen → „Kotlin“ in das Suchfeld eingeben → installieren

Schritt 2: Kotlin-Klassenpfad zum Projekt Build.Gradle hinzufügen

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
    }
}

Schritt 3: Fügen Sie die Kotlin-Bibliothek hinzu und wenden Sie Kotlin-Plugins in Ihrem Modul Build.gradle an

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

Ich bin auf denselben Fehler gestoßen, hatte aber das richtige Pom-Setup. Mein Problem war, dass ich gerade eine Java-Klasse mit Intellij in eine Kotlin-Klasse konvertiert hatte, wodurch diese Kotlin-Datei erhalten blieb src/main/java.

Die Lösung für mich war, eine zu erstellen src/main/kotlin und verschiebe meine Kotlin-Klasse dorthin und lasse meine Java-Dateien drin src/main/java. Aber Sie brauchen definitiv das Maven-Setup, das die Antwort von @yole zeigt.

  • Nur neugierig: Warum das funktioniert, ist, dass nach Kotlin-Dateien verschoben werden src/main/kotlin Sie werden vor Java-Dateien kompiliert? So funktioniert das?

    – Michael Vician

    6. April 2021 um 8:30 Uhr

Wenn jemand ein einfaches Java-Projekt mit verwendet Gradle Anstatt von Maven ändern Sie dann Ihre Modul-Gradle-Datei wie folgt:

Angenommen, Sie haben folgendes Plugin in Ihrem Modul:

apply plugin: 'java-library'

Wenn Sie ein Kotlin-Plugin haben möchten, fügen Sie das Kotlin-Plugin vor dem Java-Plugin hinzu:

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

Grund ist

Ihre Konfiguration fügt das Kotlin-Compiler-Plug-in hinzu, passt die Ausführung des Java-Compiler-Plug-ins jedoch nicht so an, dass der Java-Compiler nach dem Kotlin-Compiler ausgeführt wird. Daher wird der Java-Compiler vor Kotlin ausgeführt und sieht keine von Kotlin kompilierten Klassen.

wie von @yole in Antworten erklärt

1055010cookie-checkVerwendung der Kotlin-Klasse in Java: Symbol kann nicht gefunden werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy