我刚刚在带有IntelliJ IDEA社区的Kotlin + TornadoFX中使用以下代码建立了一个简单的Hello World项目。出于某种原因,如果我gradlew run
在命令行键入内容,它将设法通过直接加载MainApp类来运行该应用程序,但是IntelliJ坚持要求“类MainApp没有main()方法”,除非我明确编写一个main()
函数,否则将拒绝启动该应用程序。为什么是这样?如何(或完全可以)让IntelliJ以gradle管理的方式运行应用程序?
这是Kotlin源文件
import tornadofx.*
// Define application with main View `Main`
class MainApp : App(Main::class)
// Define the view to display
class Main : View() {
// override the root view with our container with the label within
override val root = hbox {
// use the tornado kotlin dsl to add a label and set the text
label {
text = "Hello World"
}
}
}
这是build.gradle.kts
plugins {
kotlin("jvm") version "1.3.72"
application
id("org.openjfx.javafxplugin") version "0.0.8"
}
javafx {
// Declare the javafx modules we need to use
modules("javafx.controls")
}
group = "org.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("no.tornado:tornadofx:1.7.20")
}
application {
mainClassName = "MainApp"
}
tasks {
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
}
下载测试项目后,我会看到几件事:
我不是Intellij或gradle的专家,所以我无法解释为什么您可以在没有主要功能的情况下使用gradle启动,但是不能从Intellij进行。我希望gradle可以注入某种主函数,该函数可以执行MainApp定义的JavaFX Application类(TornadoFX App类扩展了JavaFX Application类)。
要使此工作正常进行,您可以设置运行配置以使用gradle或将主要功能添加到MyApp.kt并更新MainApp运行配置。
使用Gradle从Intellij运行
注意:如下所述添加主要功能并更新build.gradle.kts以使用“ MainAppKt”仍然是一个好主意。这将使您在使用Java 9+启动应用程序时具有一定的灵活性,而无需模块定义(即非模块化应用程序)
使用Intellij运行
fun main(args: Array<String>) {
launch<MainApp>(args)
}
最后注意事项:如果您使用的是Java 9+,则需要使用TornadoFX的快照版本,否则会遇到问题。
使用以下命令将快照库添加到您的资源库部分
maven("https://oss.sonatype.org/content/repositories/snapshots")
并将TornadoFX版本更新为“ 2.0.0-SNAPSHOT”
implementation("no.tornado:tornadofx:2.0.0-SNAPSHOT")
旧答案
您在build.gradle.kts中缺少mainClassName设置:
application {
mainClassName = "com.example.demo.app.MyApp"
}
一些注意事项:
fun main(args: Array<String>) {
launch<MyApp>(args)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句