Gradle可以在没有main()的情况下执行TornadoFX应用,而IntelliJ无法...为什么?

井上淳:

我刚刚在带有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"
    }
}
摩洛哥:

下载测试项目后,我会看到几件事:

  1. 您的“ MainApp”运行配置未使用gradle,而是使用Intellij托管项目,该项目配置为构建和运行应用程序。
  2. MainApp.kt没有Intellij运行的“主要”功能

我不是Intellij或gradle的专家,所以我无法解释为什么您可以在没有主要功能的情况下使用gradle启动,但是不能从Intellij进行。我希望gradle可以注入某种主函数,该函数可以执行MainApp定义的JavaFX Application类(TornadoFX App类扩展了JavaFX Application类)。

要使此工作正常进行,您可以设置运行配置以使用gradle或将主要功能添加到MyApp.kt并更新MainApp运行配置。

使用Gradle从Intellij运行

  1. 单击Intellij右侧的gradle选项卡
  2. 展开“任务”->“应用程序”的kotlin-gradle配置
    注意:您可能需要单击gradle面板左上方的“刷新”按钮以刷新可用任务的列表。
  3. 双击“运行”,gradle运行任务将被执行
  4. 当您执行此操作时,Intellij将自动添加新配置“ test-project [run]”

Gradle面板的屏幕截图

注意:如下所述添加主要功能并更新build.gradle.kts以使用“ MainAppKt”仍然是一个好主意。这将使您在使用Java 9+启动应用程序时具有一定的灵活性,而无需模块定义(即非模块化应用程序)

使用Intellij运行

  1. 将以下代码添加到MainApp.kt
fun main(args: Array<String>) {
    launch<MainApp>(args)
}
  1. 编辑现有的“ MainApp”运行配置,并将Main类更改为“ MainAppKt”
  2. 单击“确定”保存,您现在可以运行“ MainApp”配置


最后注意事项:如果您使用的是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"
}

一些注意事项:

  • 如果您具有如下所示的启动应用程序的主要功能,则由于kotlin创建了一个新类来保存JVM的静态主要功能,因此您需要在该功能所在的主要类名称后附加“ Kt”。例如,如果在MyApp.kt文件中我具有以下主要功能,则需要使用“ com.example.demo.app.MyAppKt”来调用主要功能以运行应用程序。
fun main(args: Array<String>) {
    launch<MyApp>(args)
}
  • mainClassName的语法因gradle版本和语言而异。我通常使用groovy,因此我必须查找kts。当前的gradle版本6.4使用的语法与6.3不同。我提供的语法适用于6.3。我不确定何时进行更改,因此您可能需要验证gradle版本的正确语法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么execve系统调用可以在没有任何argv参数的情况下运行“ / bin / sh”,而在没有“ / bin / ls”的情况下运行?

为什么项目可以在没有工厂的情况下创建带有构造函数参数的ViewModel类的实例

为什么在Java中使用管道执行系统命令会在没有空格的情况下失败?

为什么C可以在没有库的情况下编译time()?

为什么在没有显式或隐式定义的情况下可以使用“ >> =”?

为什么我可以在没有错误声明的情况下获取子例程地址?

为什么在没有推送git的情况下提交?

为什么在没有类型应用程序的情况下某些函数调用无法工作?

为什么Qt Creator在没有.lib和LoadLibrary()的情况下可以正确链接dll?

为什么Dart隔离中的流在没有接收端口的情况下无法工作

为什么Google Maps API组件在没有* NgIf的情况下可以工作,而在排除* NgIf的情况下却可以工作?角度9

为什么在Perl中没有引号的情况下无法解析数字

为什么在c ++中可以在没有#include线程的情况下使用std :: thread?

为什么函数在没有参数的情况下运行?

为什么在没有管理员权限的情况下可以安装某些程序?

有什么方法可以在没有应用程序登录的情况下跟踪应用程序购买中的用户

为什么我可以在没有用户许可的情况下删除文件?

为什么在没有attr_writer的情况下可以设置哈希属性?

为什么在使用sudo执行时wget会给出错误,但在没有sudo的情况下可以正常工作?

为什么我可以在没有读取权限的情况下执行?

为什么此代码在没有volatile的情况下可以正常工作?

为什么在没有密码的情况下无法登录我的加密帐户?

为什么AFNetworking在没有互联网连接的情况下可以成功运行?

为什么默认情况下无法调试Android应用?

为什么Firefox无法在没有错误消息的情况下启动Css?

为什么没有执行?

为什么在没有分配正确的字节数的情况下malloc可以工作?

为什么我可以在没有 getter 方法的情况下访问私有实例变量?

为什么 foo() 函数在没有被调用的情况下被执行?