Gradle for Java 11 with Modules

dpr*_*ean 5 java javafx gradle java-module java-11

我正在尝试在Mac OS上运行示例JavaFX应用程序.

的build.gradle

apply plugin: 'java'
apply plugin: 'application'

repositories {
    mavenCentral()
}


dependencies {
    compile "org.openjfx:javafx-base:11"
    compile "org.openjfx:javafx-graphics:11"
    compile "org.openjfx:javafx-controls:11"
}

compileJava {
    doFirst {
        println "CLASSPATH IS $classpath.asPath"
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.graphics'
        ]
        classpath = files()
    }
}
Run Code Online (Sandbox Code Playgroud)

Java类

package com.test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;


public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(l, 640, 480);
        stage.setScene(scene);
        stage.show();
    }

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

}
Run Code Online (Sandbox Code Playgroud)

我使用Gradle 4.10.2

执行任务'gradle compileJava'我收到此错误:

> Task :compileJava FAILED
CLASSPATH IS /Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-controls/11/58d961774262ec972bf304e16c154a8e18c2050b/javafx-controls-11.jar:/Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-graphics/11/a736dd079047ec0b72b8c4970842a5c5e0c19f2f/javafx-graphics-11.jar:/Users/dragos.pruteanu/.gradle/caches/modules-2/files-2.1/org.openjfx/javafx-base/11/9fcd3e8e3227ec97bf503f7991fad1f3b14d005/javafx-base-11.jar
error: module not found: javafx.graphics
1 error
Run Code Online (Sandbox Code Playgroud)

怎么了?由于某种原因,未正确加载JavaFX库.可能是MacOS或OpenJFX的错误?

Nam*_*man 3

它对你来说失败的原因主要是从你使用的 jar 中派生的自动模块名称不是 javafx.graphics. 尝试使用命令行获取详细信息,我可以观察到以下内容:

jar --file=.../org/openjfx/javafx-graphics/11/javafx-graphics-11.jar --describe-module
No module descriptor found. Derived automatic module.

javafx.graphicsEmpty@11 automatic
requires java.base mandated
Run Code Online (Sandbox Code Playgroud)

并且由于解析的模块名称与您在命令行中指定的名称不同--add-modules javafx.graphics,因此您将面临所述错误。


此外,使用 JavaFX 11 运行 HelloWorld 的注释之一如下:

无需添加javafx.graphics模块,因为 模块传递需要它javafx.controls


根据评论进行编辑:-使用 Gradle和 JavaFX 运行 HelloWorld 中定义的步骤将是寻找使用 gradle 构建的适当步骤的更好位置。

正如它所述(编辑我的),需要在依赖项中指定平台,例如

compile "org.openjfx:javafx-graphics:11:$platform"
Run Code Online (Sandbox Code Playgroud)

...在 Gradle 中解决传递依赖关系时,不考虑分类器。因此,我们需要指定...以平台为分类器的模块

为此,您可能还需要示例中使用的构建脚本来指定平台/操作系统作为分类器。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
    }
}

apply plugin: 'application'
apply plugin: 'com.google.osdetector'

ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
Run Code Online (Sandbox Code Playgroud)

  • 您可能想提及[使用 Gradle 运行 HelloWorld](https://openjfx.io/openjfx-docs/#gradle) 中的内容。在 Gradle 中声明 JavaFX 依赖项时必须包含平台分类器。不幸的是,这也意味着传递依赖关系没有得到解决(尽管这不会影响“--add-modules”命令)。 (3认同)