尝试从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-compile
和default-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