web-dev-qa-db-ja.com

JavaでKotlinクラスを使用:シンボルが見つかりません

this Androidに関する同様の質問を見つけましたが、ビルドツールとしてMavenでJavaを使用しています。新しい質問を投稿する方が良いと思います。

Java class as MyKotlinClass.classとして参照しようとしているKotlinクラスを作成しました。Mavenビルドは失敗しますが、IntelliJ Ideaでのコンパイルは正常に動作します。すでに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>

しかし、それは助けにはなりません:

[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)
16
Vojtěch

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

私はこれと同じエラーに遭遇しましたが、正しいPOM設定がありました。私の問題は、IntellijでJavaクラスをKotlinクラスに変換したところ、src/main/Java

私にとっての解決策は、src/main/kotlinとKotlinクラスをそこに移動して、Javaファイルをsrc/main/Java。しかし、@ yoleの答えが示すMavenのセットアップが必ず必要です。

1
Sean