使用 Gradle 在 IntelliJ 中运行 JavaFX 项目

Posted

技术标签:

【中文标题】使用 Gradle 在 IntelliJ 中运行 JavaFX 项目【英文标题】:Running JavaFX project in IntelliJ with Gradle 【发布时间】:2020-05-21 16:41:48 【问题描述】:

我在 IntelliJ IDE 中使用 JavaFX 和 Gradle 运行 Java 程序时遇到问题。我已经查看了许多解决方案,似乎是同一个问题,但是这些都没有奏效。

这个问题:IntelliJ + Gradle + JavaFX building, but not running 与我遇到的问题以及我尝试过的修复非常相似。但是该解决方案对我不起作用。

目前我正在尝试运行一个非常简单的应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class GUI extends Application 
    @Override
    public void start(Stage primaryStage) throws Exception 
        var pane = new BorderPane();
        var input = new TextField();
        primaryStage.setScene(new Scene(pane));
        primaryStage.show();
    

当使用命令行和“gradlew run”时,此应用程序会运行,但在使用 IntelliJ IDEA IDE 时它不会运行。

奇怪的是,如果我删除 TextField 的“输入”,程序运行没有问题。这让我相信这个问题与模块 java.controls 有关。但是,这是在我的 build.gradle 中导入的:

plugins 
    id 'java'

    id 'application'

    id 'jacoco'

    id 'org.openjfx.javafxplugin' version '0.0.8'


javafx 
    modules = [ 'javafx.controls', 'javafx.fxml' ]


repositories 
    jcenter()


dependencies 
    // Use JUnit Jupiter Engine for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.1'
    // Allow for JUnit 4 legacy
    testCompileOnly 'junit:junit:4.12'
    testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.5.1'


application 
    mainClassName = 'bfst20.addressparser.GUI'


test 
    useJUnitPlatform()


jar 
    manifest 
        attributes 'Main-Class': application.mainClassName
    

尝试使用 TextField 运行程序时会出现以下 2 个错误:

查看项目库时,您会得到以下概述:

这清楚地显示了存在的库。

运行 'gradlew --info run' 时,我得到以下输出:

> Task :run
Caching disabled for task ':run' because:
  Build cache is disabled
Task ':run' is not up-to-date because:
  Task has not declared any outputs despite executing actions.
Starting process 'command 'C:\Program Files\Java\jdk-11.0.4\bin\java.exe''. Working directory: C:\Users\ASUS\FST\handin1 Command: C:\Program Files\Java\jdk-11.0.4\bin\java.exe --add-modules javafx.controls,javafx.fxml --module-path C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-fxml\12.0.1\5397068b7fb8f8db6631242d78e14f7d6db07d51\javafx-fxml-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\12.0.1\838555460c025b8df0fbc0fa03bf3f3767698f89\javafx-controls-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\12.0.1\18a01ffdd4edb82e7da3bc99937c6a608d1eaaa6\javafx-graphics-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\12.0.1\6f5947b255bb26e072862b3bb0c32d54d8effe84\javafx-base-12.0.1-win.jar -Dfile.encoding=windows-1252 -Duser.country=DK -Duser.language=da -Duser.variant -cp C:\Users\sande\OneDrive\Dokumenter\ITU\2. Semester\FST\handin1\build\classes\java\main;C:\Users\sande\OneDrive\Dokumenter\ITU\2. Semester\FST\handin1\build\resources\main;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-fxml\12.0.1\5397068b7fb8f8db6631242d78e14f7d6db07d51\javafx-fxml-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\12.0.1\838555460c025b8df0fbc0fa03bf3f3767698f89\javafx-controls-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\12.0.1\a6502999bdb947885c8d121a47d745d52a06577a\javafx-controls-12.0.1.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\12.0.1\18a01ffdd4edb82e7da3bc99937c6a608d1eaaa6\javafx-graphics-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\12.0.1\19ec56a15d7dd9c49112912547425b718485d7db\javafx-graphics-12.0.1.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\12.0.1\6f5947b255bb26e072862b3bb0c32d54d8effe84\javafx-base-12.0.1-win.jar;C:\Users\Ejer\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\12.0.1\6abae81d00e0c6f4fde02e2666f9c0b989ff47e4\javafx-base-12.0.1.jar bfst20.addressparser.GUI
Successfully started process 'command 'C:\Program Files\Java\jdk-11.0.4\bin\java.exe''
:run (Thread[Daemon worker,5,main]) completed. Took 28.566 secs.

【问题讨论】:

这是 JavaFX 11: IllegalAccessError when creating Label 的副本,至少关于您从 IDE 运行时遇到的错误。 非常肯定。然而,该解决方案似乎侧重于如何安装 JavaFX 并将库/模块手动添加到 IntelliJ,据我所知,这应该由 Gradle 处理。 嗯,就是这样,当你使用 Gradle 时。但是,当您通过 IntelliJ 运行时,您不使用 Gradle 有一个 gradle 窗口,您可以在其中选择要运行的任务,并且您可以创建一个从 IntelliJ 运行的 gradle 配置,而不是默认配置, openjfx.io/openjfx-docs/#IDE-Intellij,使用 Gradle 的非模块化部分,运行项目显示一个选项。对于另一个,只需转到 Run->Edit Configurations...->Add New Configuration(选择 Gradle 模板,选择项目并添加运行任务)。 【参考方案1】:

您可以手动创建以下配置来启动您的 JavaFX 应用程序:https://prnt.sc/qyaos2 或单击 Gradle 上下文选项卡中的“运行”任务:https://prnt.sc/qyas3y

文档中描述了启动 Gradle 任务的所有可能选项:https://www.jetbrains.com/help/idea/work-with-gradle-tasks.html

【讨论】:

以上是关于使用 Gradle 在 IntelliJ 中运行 JavaFX 项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 Groovy、IntelliJ 和 Gradle 在项目中“重新运行 Spring Boot 配置注释处理器”

如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试

选择要运行的配置类型时,在 IntelliJ IDEA 15 中运行 Gradle 测试而不是 Junit 测试

在 Intellij 中无法识别 Gradle 依赖项

Gradle 解决依赖关系并构建/运行良好,但 IntelliJ 没有

使用基于 Gradle 的配置时在 Android Studio (IntelliJ) 上运行简单的 JUnit 测试