web-dev-qa-db-fra.com

Utilisation de la classe Kotlin en Java: le symbole est introuvable

J'ai trouvé ceci une question similaire concernant Android, mais j'utilise Java pur avec Maven comme outil de compilation. Je pense qu'il est préférable de poster une nouvelle question.

J'ai créé une classe Kotlin à laquelle j'essaie de faire référence depuis la classe Java en tant que MyKotlinClass.class. La compilation Maven échoue, alors que la compilation dans IntelliJ Idea fonctionne correctement. J'ai déjà ajouté le plugin Kotlin à maven:

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

Cependant cela n'aide pas:

[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

La ligne/colonne se réfère exactement au symbole MyKotlinClass.class. Cela échouera même en utilisant comme ceci:

System.err.println(MyKotlinClass.class)
13
Vojtěch

Votre configuration Maven ajoute le plug-in du compilateur Kotlin, mais ne modifie pas l'exécution du plug-in du compilateur Java afin que celui-ci s'exécute après le compilateur Kotlin. Par conséquent, le compilateur Java s'exécute avant Kotlin et ne voit pas les classes compilées par Kotlin.

Voici un extrait montrant la configuration correcte pour un projet multilingue (extrait de la 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>
42
yole

J'ai rencontré cette même erreur, mais j'avais la bonne configuration de pom. Mon problème était que je venais de convertir une classe Java en classe Kotlin avec Intellij, ce qui a laissé ce fichier Kotlin dans src/main/Java.

La solution pour moi était de créer un src/main/kotlin, d'y déplacer ma classe Kotlin et de laisser mes fichiers Java dans src/main/Java. Mais vous avez certainement besoin de la configuration de maven que la réponse de @ yole montre.

0
Sean