有没有办法可以在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()
函数需要访问launch()
中定义的App
方法。出于某种原因,companion
关键字不允许这样做:/如果这些信息相关,我们可以重新考虑下注吗?
答案 0 :(得分:3)
伴侣对象中的静态方法被放置在封闭类中。所以在你的情况下MyApp
。无论您是否命名伴随对象,都是如此,并且在运行该类时无需以任何方式引用该伴随。
因此,假设以下情况属实,您的代码是正确的:
path.to.application
(您不显示软件包语句)path.to.application.MyApp
的类未找到错误且匹配#2,(您没有显示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)
}
}
}
这些其他相关问题也有类似的提示: