如何在 JavaExec 任务类路径中包含插件依赖项?
How to include plugin dependencies in JavaExec task classpath?
我正在使用 JavaExec 任务来 运行 不同的 类,但是每当我尝试 运行 使用 gradle <task>
的任务之一时,我都会收到一条错误消息 Error: JavaFX runtime components are missing, and are required to run this application
.
如果我只是设置 mainClassName='exercise1.Cards'
或任何其他类名,运行ning gradle run
完全可以正常工作。我猜测当使用 JavaExec 运行ning 类 时找不到 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
plugin 为您管理一些事情。
当您添加到构建文件时:
javafx {
modules = [ 'javafx.controls' ]
}
插件 translates 变成类似这样的东西:
run {
doFirst {
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls']
}
}
但是,如果您创建一个新的 JavaExec
任务,插件似乎不会处理它。
鉴于您发布的错误:
Error: JavaFX runtime components are missing
很明显,一个可能的解决方法是完全按照插件的方式进行操作,并在使用模块化依赖项时添加预期的 jvm args。
所以这应该有效:
task runExercise1(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls' ]
main = 'exercise1.Cards'
}
或者,您可以创建一个不从 Application
扩展的启动器 class,因为这将绕过模块化检查(如 所述)。
public class Launcher {
public static void main(String[] args) {
// optionally process args to select class to run
Cards.main(args);
}
}
然后你可以添加你的任务,甚至使用 运行 时间参数到 select 从启动器到 class 到 运行。
task runExercise1(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'exercise1.Launcher'
args 'exercise1' // <-- optionally select class to run
}
我正在使用 JavaExec 任务来 运行 不同的 类,但是每当我尝试 运行 使用 gradle <task>
的任务之一时,我都会收到一条错误消息 Error: JavaFX runtime components are missing, and are required to run this application
.
如果我只是设置 mainClassName='exercise1.Cards'
或任何其他类名,运行ning gradle run
完全可以正常工作。我猜测当使用 JavaExec 运行ning 类 时找不到 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
plugin 为您管理一些事情。
当您添加到构建文件时:
javafx {
modules = [ 'javafx.controls' ]
}
插件 translates 变成类似这样的东西:
run {
doFirst {
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls']
}
}
但是,如果您创建一个新的 JavaExec
任务,插件似乎不会处理它。
鉴于您发布的错误:
Error: JavaFX runtime components are missing
很明显,一个可能的解决方法是完全按照插件的方式进行操作,并在使用模块化依赖项时添加预期的 jvm args。
所以这应该有效:
task runExercise1(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['--module-path', classpath.asPath,
'--add-modules', 'javafx.controls' ]
main = 'exercise1.Cards'
}
或者,您可以创建一个不从 Application
扩展的启动器 class,因为这将绕过模块化检查(如
public class Launcher {
public static void main(String[] args) {
// optionally process args to select class to run
Cards.main(args);
}
}
然后你可以添加你的任务,甚至使用 运行 时间参数到 select 从启动器到 class 到 运行。
task runExercise1(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'exercise1.Launcher'
args 'exercise1' // <-- optionally select class to run
}