Gradle для Java 11 с модулями - PullRequest
       31

Gradle для Java 11 с модулями

0 голосов
/ 05 ноября 2018

Я пытаюсь запустить пример приложения JavaFX в Mac OS.

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()
    }
}

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();
    }

}

Я использую 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

Что не так? По какой-то причине библиотеки JavaFX загружены неправильно. Может быть ошибка в MacOS или OpenJFX?

1 Ответ

0 голосов
/ 05 ноября 2018

Причина, по которой он потерпит неудачу, состоит в основном в том, что имя автоматического модуля , полученное из используемого вами фляги, не будет 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

и поскольку разрешенное имя модуля отличается от указанного в командной строке --add-modules javafx.graphics, следовательно, вы столкнулись с указанной ошибкой.


Кроме того, одна из заметок из Run HelloWorld с использованием JavaFX 11 гласит:

нет необходимости добавлять javafx.graphics модуль, так как он транзитивно требуется для javafx.controls модуля


Редактировать из комментариев : - Шаги, определенные в Запуск HelloWorld с использованием Gradle с JavaFX будет лучшим местом для поиска подходящих шагов для сборки с помощью gradle.

Как говорится (редактирует мой), нужно указать платформу в зависимостях, например,

compile "org.openjfx:javafx-graphics:11:$platform"

... классификаторы не учитываются при разрешении переходных зависимости в 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
...