繁体   English   中英

如何在JavaExec任务类路径中包含插件依赖项?

[英]How to include plugin dependencies in JavaExec task classpath?

我正在使用JavaExec任务来运行不同的类,但每当我尝试使用gradle <task>运行其中一个gradle <task> ,我会收到Error: JavaFX runtime components are missing, and are required to run this application

如果我只是设置mainClassName='exercise1.Cards'或其他任何className,运行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'
}

org.openjfx.javafxplugin 插件为您管理一些事情。

添加到构建文件时:

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

该插件其转换为:

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

但是,如果您创建新的JavaExec任务,则插件似乎不会处理它。

鉴于您发布的错误:

错误:缺少JavaFX运行时组件

很明显,一个可能的解决方案是完成插件的功能,并在使用模块化依赖项时添加预期的jvm args。

所以这应该工作:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM