有没有办法在 Kotlin 的现有类中静态编译 main()
方法?我试图让 Gradle 使用main()
方法将其构建为应用程序,但我没有运气。我也一直在尝试几种解决方法...
class MyApp: App() {
override val primaryView = MyView::class
companion object Launcher {
@JvmStatic
fun main(args: Array<String>): Unit {
launch(*args)
}
}
}
在我的 Gradle 脚本中,我尝试指定类MyApp
具有main()
方法。它出错了,找不到类,但是当我打电话给run
时。
mainClassName = 'path.to.application.MyApp'
编辑
对于混乱,我深表歉意,但我的部分问题可能与子类有关,不一定找到main()
类。
main()
函数需要访问 App
中定义的 launch()
方法。出于某种原因,放置companion
关键字不允许这样做:/如果这些信息是相关的,我们能重新考虑反对票吗?
伴随对象中的静态方法被放置在封闭类上。 所以在你的情况下MyApp
. 无论命名同伴对象如何,都是如此,并且在运行类时不需要以任何方式引用同伴。
因此,假设以下情况为真,您的代码是正确的:
- 您已在 Gradle 中应用了应用程序插件
- 您将包含上述代码的包命名为
path.to.application
(您不显示包语句) - 您收到一个
path.to.application.MyApp
找不到类的错误,并且与 #2 匹配(您没有显示来自 Gradle 的实际错误) - 您正在运行正确的 gradle 任务(您正在运行哪个任务?
- 代码实际上是编译的,查看您最新的注释表明您可能遇到了编译器错误(
launch()
方法无法从同伴访问),这意味着您无法运行尚未编译的内容。
您可以做的检查类名是右键单击 Intellij IDEA 中的 main()
方法create path.to.app...
然后选择位于运行/调试选项下方的菜单选项,当打开运行时配置对话框时,您可以在那里看到完整的类名。 这应该与 Gradle 中使用的相同。 如果您已经有运行时配置,只需在此处查看完整的类名。 如果这不起作用,则问题出在其他地方,您需要提供缺少的信息(Gradle 任务是什么,实际错误是什么,类的包语句是什么)
问题中缺少一些有助于缩小范围的信息。
此示例:
package org.test.kotlin
class MyApp {
companion object Launcher {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
运行类org.test.kotlin.MyApp
时工作正常
没有Launcher
字的也是如此:
package org.test.kotlin
class MyApp {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
这是偶然的,但没有做你期望的事情,而是创建一个嵌套类并在那里添加静态并使用类org.test.kotlin.MyApp.Launcher
运行。 如果这有效,那么问题没有显示它正在使用的实际主类名,这是失败的:
package org.test.kotlin
class MyApp {
object Launcher {
@JvmStatic
fun main(args: Array<String>) {
println("hello")
}
}
}
关于可能的编译器错误(上面的#5):在您的代码中,您引用了未显示的launch()
方法,也许它在祖先类中。 但是您没有创建任何类的实例。 因此,这将因编译器错误而失败。 将其更改为:
class MyApp: App() {
override val primaryView = MyView::class
companion object {
@JvmStatic
fun main(args: Array<String>): Unit {
MyApp().launch(*args)
}
}
}
类似的提示在以下其他相关问题中:
- 您关于如何运行的问题在另一个 SO 问题中得到了回答:https://stackoverflow.com/a/26402542/3679676
- 如何从命令行运行 Kotlin 类?
- 如何在 Kotlin 中运行编译的类文件?