Как включить зависимости плагинов в classpath задачи JavaExec? - PullRequest
0 голосов
/ 21 февраля 2019

Я использую задачи JavaExec для запуска разных классов, но всякий раз, когда я пытаюсь выполнить одну из задач, используя gradle <task>, я получаю сообщение об ошибке: Error: JavaFX runtime components are missing, and are required to run this application.

Если я просто задаю mainClassName='exercise1.Cards'или любой другой className, запуск gradle run работает совершенно нормально.Я предполагаю, что классы JavaFX не обнаруживаются при запуске классов с JavaExec, и мне интересно, как я могу их включить.

build.gradle:

plugins {
    id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.7'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

javafx {
    modules = [ 'javafx.controls' ]
}

task runExercise1(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'exercise1.Cards'
}

task runExercise2(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'exercise2.InvestmentCalculator'
}

task runExercise3(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'exercise3.PointCircle'
}

task runExercise4(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'exercise4.OccurrenceHistogram'
}

1 Ответ

0 голосов
/ 21 февраля 2019

Плагин org.openjfx.javafxplugin управляет для вас несколькими вещами.

Когда вы добавляете в свой файл сборки:

javafx {
    modules = [ 'javafx.controls' ]
}

, плагин переводит в нечто вроде:

run {
    doFirst {
        jvmArgs = ['--module-path', classpath.asPath,
                   '--add-modules', 'javafx.controls']
    }
}

Однако, если выСоздайте новую задачу JavaExec, похоже, что плагин не обрабатывает ее.

Учитывая опубликованную вами ошибку:

Ошибка: отсутствуют компоненты времени выполнения JavaFX

ясно, что возможное исправление состоит в том, чтобы делать именно то, что делает плагин, и добавлять ожидаемые аргументы jvm при использовании модульных зависимостей.

Так что это должно работать:

task runExercise1(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    jvmArgs = ['--module-path', classpath.asPath, 
               '--add-modules', 'javafx.controls' ]
    main = 'exercise1.Cards'
}

В качестве альтернативы вы можете создать класс запуска, который не расширяется от Application, так как он пропустит модульную проверку (как объяснено здесь ).

public class Launcher {

    public static void main(String[] args) {
        // optionally process args to select class to run
        Cards.main(args);
    }
}

Тогда вы могли быдобавьте свою задачу и даже используйте аргументы времени выполнения, чтобы выбрать основной класс для запуска из модуля запуска.

task runExercise1(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'exercise1.Launcher'
    args 'exercise1' // <-- optionally select class to run
}
...