IntelliJ + Gradle + JavaFX 构建,但未运行

Posted

技术标签:

【中文标题】IntelliJ + Gradle + JavaFX 构建,但未运行【英文标题】:IntelliJ + Gradle + JavaFX building, but not running 【发布时间】:2020-04-07 15:29:27 【问题描述】:

我正在尝试在 Windows 上的 IntelliJ IDEA Ultimate 中使用 JavaFX 运行 Gradle 项目。 JavaFX 是在我们最新的 Git 推送中添加的,在它工作之前。

我可以毫无问题地构建项目。运行 main 时出现错误: 我有:

JDK 11.0.5(来自 Oracle 站点,不是 openJDK),我使用的是 Java 11,全部在 IntelliJ 中配置 JDK 安装目录(特别是其中的 /bin 目录)添加到我的 PATH 中 JDK安装目录添加JAVA_HOME环境变量

项目结构:

build.gradle(不是我建的,我不明白里面到底写了什么以及为什么):

plugins 
    id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.8'


group 'transportCompany'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories 
    mavenCentral()


dependencies 
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'org.mongodb:mongodb-driver-sync:3.11.2'
    compile group: 'org.openjfx', name: 'javafx', version: '11.0.2', ext: 'pom'


javafx 
    version = "11.0.2"
    modules = [ 'javafx.controls', 'javafx.fxml' ]

Main.java:

public class TransportCompanyApp extends Application 

    private Stage primaryStage;
    private MainAppPresenter presenter;

    @Override
    public void start(Stage primaryStage) 

        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("My first JavaFX app");
        presenter = new MainAppPresenter(primaryStage);
        this.presenter.initRootLayout();
        //this.primaryStage.show();

    

    public static void main(String[] args) 
        launch(args);
    

如果我理解正确,IntelliJ 会看到所有文件,代码中没有未解析的引用,所有导入都有效。

JavaFX jars 由 Gradle 下载:

它们被配置为“库”,而不是“全局库”,因为它们不应该这样,如果我理解正确,应该使用 Gradle 构建、下载所有内容并运行。

我尝试使用 Git Checkout 创建新项目,但没有成功。奇怪的是,虽然它对我的同事有用(他们有相同的设置:JDK 11、Java 11、Windows;有些甚至根本没有 JAVA_HOME,它对他们有用)。

我尝试过的:

JavaFX 入门 Error: JavaFX runtime components are missing, and are required to run this application with JDK 11 Error: JavaFX runtime components are missing - JavaFX 11 and OpenJDK 11 and Eclipse IDE https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000909940-Openjfx-11 https://openjfx-dev.openjdk.java.narkive.com/aFiw9uqi/error-javafx-runtime-components-are-missing-and-are-required-to-run-this-application 使用 JDK 13 和 Java 13 将项目更改为模块化 使用 JavaFX 作为全局库并将其导入到模块中

我还能做什么?我只想让 Gradle 下载我需要的任何东西并运行这个项目。我们在大学里通过类似项目的 JavaFX 介绍做到了这一点,它确实适用于我当前的配置(唯一的区别是那个配置是​​ Maven)。

编辑 运行gradlew --info run 后我得到了:

> Task :run FAILED
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.5\bin\java.exe''. Working directory:
C:\Users\Lenovo\Desktop\TO Command: C:\Program Files\Java\jdk-11.0.5\bin\java.exe --add-modules
 javafx.controls,javafx.fxml --module-path C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\o
rg.openjfx\javafx-fxml\11.0.2\b3242e4c031558574de2a1da685bb5fcdbb8a530\javafx-fxml-11.0.2-win.j
ar;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-controls\11.0.2\6c7637
07769c18adce406904c771c2ad1fcc370b\javafx-controls-11.0.2-win.jar;C:\Users\Lenovo\.gradle\cache
s\modules-2\files-2.1\org.openjfx\javafx-graphics\11.0.2\20459ea2cf714942bcbeb78a7f70ba3531dc1a
44\javafx-graphics-11.0.2-win.jar;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.openjf
x\javafx-base\11.0.2\1852e57b8cf9a9b6488c33605bccd5d06ff210e1\javafx-base-11.0.2-win.jar -Dfile
.encoding=windows-1250 -Duser.country=PL -Duser.language=pl -Duser.variant -cp C:\Users\Lenovo\
Desktop\TO\build\classes\java\main;C:\Users\Lenovo\Desktop\TO\build\resources\main;C:\Users\Len
ovo\.gradle\caches\modules-2\files-2.1\org.mongodb\mongodb-driver-sync\3.11.2\a011ecee75c110e95
d33ece066f4bee149d5487a\mongodb-driver-sync-3.11.2.jar;C:\Users\Lenovo\.gradle\caches\modules-2
\files-2.1\org.openjfx\javafx\11.0.2\6e90384c9fb4ec7ed8186c0e916c419c87a24cbf\javafx-11.0.2.pom
;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-fxml\11.0.2\b3242e4c0315
58574de2a1da685bb5fcdbb8a530\javafx-fxml-11.0.2-win.jar;C:\Users\Lenovo\.gradle\caches\modules-
2\files-2.1\org.openjfx\javafx-controls\11.0.2\6c763707769c18adce406904c771c2ad1fcc370b\javafx-
controls-11.0.2-win.jar;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-c
ontrols\11.0.2\4ab633cf1eea60f76e2ae9905aedac862da88b08\javafx-controls-11.0.2.jar;C:\Users\Len
ovo\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-graphics\11.0.2\20459ea2cf714942bcbeb
78a7f70ba3531dc1a44\javafx-graphics-11.0.2-win.jar;C:\Users\Lenovo\.gradle\caches\modules-2\fil
es-2.1\org.openjfx\javafx-graphics\11.0.2\e522eb4ea422eceeee207b1c266ba3db19b2343a\javafx-graph
ics-11.0.2.jar;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.openjfx\javafx-base\11.0.
2\1852e57b8cf9a9b6488c33605bccd5d06ff210e1\javafx-base-11.0.2-win.jar;C:\Users\Lenovo\.gradle\c
aches\modules-2\files-2.1\org.openjfx\javafx-base\11.0.2\7fb2e4a8528ec9e434a9ac9ee98b39af79e6dc
b8\javafx-base-11.0.2.jar;C:\Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.mongodb\mongod
b-driver-core\3.11.2\798e2d948326c5bfd9924e524bab22ee39c8f4f\mongodb-driver-core-3.11.2.jar;C:\
Users\Lenovo\.gradle\caches\modules-2\files-2.1\org.mongodb\bson\3.11.2\96b17202f1250736ba83021
ff56550e83e8fd8c5\bson-3.11.2.jar TransportCompanyApp
Successfully started process 'command 'C:\Program Files\Java\jdk-11.0.5\bin\java.exe''
Error: Could not find or load main class TransportCompanyApp
Caused by: java.lang.ClassNotFoundException: TransportCompanyApp
:run (Thread[Daemon worker,5,main]) completed. Took 0.367 secs.

FAILURE: Build failed with an exception.

【问题讨论】:

如何运行应用程序?作为来自 IntelliJ 的 Java 应用程序或使用 Gradle 任务(来自 IntelliJ 或终端的 Gradle 窗口)? @JoséPereda 来自 IntelliJ,我认为是 Gradle。至少当我使用“运行”选项时,Gradle 会启动并尝试运行我的 main。 确保你确实使用了 gradle 任务。您可以尝试的最佳测试是使用gradlew --info run 从终端运行。如果您仍然有同样的错误,请将其发布(作为文本,而不是作为图像)。 @JoséPereda 我将其添加为编辑。 您需要在构建文件中设置mainClassName = "app.TransportCompanyApp"。至少你没发。 (确保设置正确的名称) 【参考方案1】:

问题解决了。我做了什么:

    gradle.build 中删除了 compile group: 'org.openjfx', name: 'javafx', version: '11.0.2', ext: 'pom' 作为依赖项。 将gradle.build 中的mainClassName 更改为mainClassName = "app.TransportCompanyApp"。 将 IntelliJ 中的运行选项更改为使用 gradle run

【讨论】:

以上是关于IntelliJ + Gradle + JavaFX 构建,但未运行的主要内容,如果未能解决你的问题,请参考以下文章

Intellij 处理混合项目(maven+gradle)

Intellij插件开发教程1:用Intellij出的Gradle插件进行开发

带有 QueryDSL 和 Gradle 的 IntelliJ 15

导入 Gradle 项目到 IntelliJ IDEA

IntelliJ + Gradle + JavaFX 构建,但未运行

带有 Intellij 的 Gradle 6 - 刷新失败