gpt4 book ai didi

java - Gradle 可以在没有 main() 的情况下执行 TornadoFX 应用程序,而 IntelliJ 不能......为什么?

转载 作者:行者123 更新时间:2023-12-03 05:04:20 27 4
gpt4 key购买 nike

我刚刚使用 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"
}
}

最佳答案

下载您的测试项目后,我看到了几件事:

  • “MainApp”的运行配置未使用 gradle,而是使用配置为构建和运行应用程序的 Intellij 托管项目。
  • MainApp.kt 没有供 Intellij 运行的“主”函数

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

    要使其正常工作,您可以设置运行配置以使用 gradle 或将 main 函数添加到 MyApp.kt 并更新 MainApp 运行配置。

    使用 Gradle 从 Intellij 运行
  • 单击 Intellij
  • 右侧的 gradle 选项卡
  • 展开 Tasks -> application 的 kotlin-gradle 配置 注意:您可能需要单击 gradle 面板左上角的“刷新”按钮来刷新可用任务列表。
  • 双击“运行”,将执行gradle run任务
  • 执行此操作时,Intellij 将自动添加新配置“test-project [run]”

  • Screenshot of Gradle Panel

    注:如下所述添加 main 函数并更新 build.gradle.kts 以使用“MainAppKt”仍然是一个好主意。这将为您在使用 Java 9+ 启动应用程序时提供一些灵 active ,而无需模块定义(即非模块化应用程序)

    使用 Intellij 运行
  • 将以下代码添加到您的 MainApp.kt

  • fun main(args: Array<String>) {
    launch<MainApp>(args)
    }
  • 编辑您现有的“MainApp”运行配置并将 Main 类更改为“MainAppKt”
  • 单击确定保存,您现在可以运行“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"
    }

    一些注意事项:
  • 如果您有一个启动应用程序的主函数,如下所示,那么您需要将“Kt”附加到该函数所在的主类名称,因为 kotlin 创建了一个新类来保存 JVM 的静态主函数。例如,如果在 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 版本的正确语法。
  • 关于java - Gradle 可以在没有 main() 的情况下执行 TornadoFX 应用程序,而 IntelliJ 不能......为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62059939/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com