【问题标题】:How to include plugin dependencies in JavaExec task classpath?如何在 JavaExec 任务类路径中包含插件依赖项?
【发布时间】:2019-07-14 16:57:32
【问题描述】:

我正在使用 JavaExec 任务来运行不同的类,但是每当我尝试使用 gradle <task> 运行其中一项任务时,都会收到一条错误消息,提示 Error: JavaFX runtime components are missing, and are required to run this application

如果我只设置mainClassName='exercise1.Cards' 或任何其他类名,运行gradle run 完全可以正常工作。我猜想在使用 JavaExec 运行类时找不到 JavaFX 类,我想知道如何包含它们。

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'
}

【问题讨论】:

    标签: java gradle javafx javafx-11


    【解决方案1】:

    org.openjfx.javafxpluginplugin 为您管理一些事情。

    当您添加到构建文件时:

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

    插件translates 类似于:

    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 扩展的启动器类,因为这将绕过模块化检查(如here 所述)。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 2011-12-16
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      相关资源
      最近更新 更多