尝试从Java实例化Kotlin类时出错

我试图从Java实例化Kotlin类,但每次我尝试用Maven编译时,我得到的错误cannot find symbol

 class ConfigCommand(private val game: Game) : Command("config", "") { init { addAliases("cfg") } override fun getRequiredRank(): Rank? { return null } override fun getDescription(): String { return "Shows the config for the game" } @Throws(CommandException::class) override fun execute(sender: CommandSender, args: Array<String>): Boolean { if (args.isEmpty()) { if (sender !is Player) throw NoConsoleAccessException() sender.openInventory(ConfigGUI(game).build()) return true } return false } } 

不知道为什么没有正确格式,但无论如何,在我将它转换为Kotlin类它工作之前,但我需要在我的主类,这是一个Java类注册此命令。 当我尝试从Java类实例化Kotlin类时,IDE中没有错误,但是当我去编译Maven尖叫

 cannot find symbol [ERROR] symbol: class ConfigCommand 

我仍然在搞清楚Kotlin,但是我试图根据你的例子通过一些排列组合。 我很容易能够根据你的哈斯宾狗创建你的问题。

你是对的,把<phase>改成process-sources让我的测试代码在Maven中编译,但是我(老实说)不能总是记住所有的Maven阶段,所以我不会亲自在没有更多研究的情况下转换为流程源,特别是IntelliJ工具依赖于compile阶段。

在使用我自己的interop示例之后,似乎是关键的(缺少工具默认设置),piece是作为<build>的顶级子元素的<sourceDirectory>元素,如下所示:

 <build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> 

当我运行mvn compile terminal命令时,将<sourceDirectory>作为<build>下的顶级元素添加,使得我的Java可以被编译为Kotlin互操作代码。 当我将“java”目录中的源文件混合为包含Java和Kotlin文件时,情况就是如此。

作为一个侧面说明(我不明白为什么,当我写这个),当我添加“Kotlin”作为我的类名称的一部分到我的Kotlin源,我不需要添加<sourceDirectory>元素…

经过这个页面多次,并意识到我没有做错什么,我开始只是搅乱我的POM,并最终通过改变Kotlin编译阶段的工作process-sources

maven-compiler-plugin添加了在相应阶段中首先运行的默认执行default-compiledefault-testCompile

为了在Java代码中使用Kotlin类,需要在运行Java编译器之前运行Kotlin编译器。 一种方法是将其执行安排到process-sources阶段。 另一种方法是在执行Kotlin插件之后,取消调度Java插件的默认执行并安排新的执行。

Java插件的默认执行在pom.xml的这一部分被关闭:

  <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> ... </executions> </plugin> 

然后添加新的执行:

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

完整的例子显示在这里: https : //kotlinlang.org/docs/reference/using-maven.html#compiling-kotlin-and-java-sources