Java 11,JavaFX,Gradle,Eclipse,令人讨厌的失败消息
Java 11, JavaFX, Gradle, Eclipse, nasty failure message
OS:Linux Mint 18.3,Eclipse“2019-06”。 Gradle 包装器使用 Gradle 5.4.
昨天我花了大约 4 个小时试图在 Eclipse 中组合一个项目,该项目实际上 运行 并在使用 Java 11 时显示 JavaFX 场景。我在由于 .
的帮助而结束
但这只是 Eclipse 中的标准 "Java project"。我实际上需要做的是开发一个 Gradle 项目,使用 Groovy 作为主要语言。
我再次从同一位绅士 José Pereda 那里找到了 。这对下面的测试是 Gradle "build" OK。但是当我使用 Gradle "application" 插件的任务 "run" 时,我收到一条讨厌的消息:"Error: JavaFX runtime components are missing, and are required to run this application"。无论我是从 Eclipse 内部还是从终端 运行,我都会得到这个。
所以这是我的 build.gradle:
plugins {
id 'java-library'
id 'groovy'
id 'eclipse'
id 'application'
id 'java'
}
mainClassName = 'core.App'
group 'Project'
version '1.0'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.codehaus.groovy:groovy-all:2.5.8'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
// these seemed to do the trick for a simple "Java project"
// ... but Gradle seems to want something else (?)
implementation "org.openjfx:javafx-base:11:${platform}"
implementation "org.openjfx:javafx-graphics:11:${platform}"
implementation "org.openjfx:javafx-controls:11:${platform}"
implementation "org.openjfx:javafx-fxml:11:${platform}"
}
这是我的申请代码:
import javafx.application.Application
import javafx.stage.Stage
class App extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
println "start...."
}
public static void main(String[] args) {
println "about to launch..."
launch(args);
println "...launched"
}
}
这是我的测试:
class FuncSpec extends Specification {
def "JavaFX should run OK"(){
when:
App app = new App()
then:
true
}
}
Gradle "run" 后终端的完整输出如下:
mike@M17A ~/software projects/eclipse-workspace/GrVocabSearch2019-09 $ ./gradlew run
> Task :run FAILED
Error: JavaFX runtime components are missing, and are required to run this application
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-11-openjdk-amd64/bin/java'' finished with non-zero exit value 1
稍后
按照 José Pereda 对我 build.gradle 中的信件的指示。这就是我在尝试执行 "run" 任务时得到的结果:
> Task :run FAILED
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7 (file:/media/chris/W10%20D%20drive/apps/Chris.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.8/2f1e8ea55e625fe51e85ef35eb067f1d9c61772d/groovy-2.5.8.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Error: class jdk.internal.reflect.NativeMethodAccessorImpl is not a subclass of javafx.application.Application
at javafx.graphics/javafx.application.Application.launch(Application.java:298)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1491)
at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.callStatic(StaticMetaClassSite.java:62)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:196)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:208)
at core.App.main(main.groovy:60)
... 11 more
Exception running application core.App
FAILURE: Build failed with an exception
备注
我相信这不是任何未提及 Gradle 的答案的重复。我已经在正常 Java 运行.
中正常工作了
问题原因:
Error: JavaFX runtime components are missing, and are required to run this application
已经回答了很多次(包括 Gradle),但由于您仍在使用 "old" 方法来包含 JavaFX 依赖项,而不是使用 JavaFX 插件,我将解释如何解决这个问题。
错误
如果您查看 Eclipse 的 JavaFX 文档,第 IDE 部分(模块化或非模块化项目),对这个问题有明确的解释:
或者,换句话说,JavaFX 依赖项是模块化的,必须添加到模块路径中。
第一个解
如果您继续阅读,您会立即找到有关如何修复它的说明(前提是您不使用构建工具):
但是,由于您使用的是 Gradle,解决方案必须进行调整才能包含在您的构建文件中。
这是完成的方式,在 使用 JavaFX 插件之前:
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
现在你应该可以 运行:
./gradlew run
顺便说一句,在使用插件之前,您仍然可以看到 here 从文档中引用的 HelloFX 示例的构建。
JavaFX 插件
Gradle 的 JavaFX plugin 正是为了处理构建文件中的所有 "boilerplate code" 而创建的。
如果您现在查看 Eclipse 的文档,部分 Gradle(模块化或非模块化),或相同的更新 sample,您将看到构建文件被简化为:
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
repositories {
mavenCentral()
}
dependencies {
}
javafx {
version = "13"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
mainClassName = 'org.openjfx.MainApp'
在你的情况下,你只需要将其适应你的构建文件,例如:
plugins {
id 'java-library'
id 'groovy'
id 'eclipse'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
mainClassName = 'core.App'
group 'Project'
version '1.0'
sourceCompatibility = 11
repositories {
mavenCentral()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.codehaus.groovy:groovy-all:2.5.8'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
}
javafx {
version = "13"
modules = [ "javafx.controls", "javafx.fxml" ]
}
和运行:
./gradlew run
OS:Linux Mint 18.3,Eclipse“2019-06”。 Gradle 包装器使用 Gradle 5.4.
昨天我花了大约 4 个小时试图在 Eclipse 中组合一个项目,该项目实际上 运行 并在使用 Java 11 时显示 JavaFX 场景。我在由于
但这只是 Eclipse 中的标准 "Java project"。我实际上需要做的是开发一个 Gradle 项目,使用 Groovy 作为主要语言。
我再次从同一位绅士 José Pereda 那里找到了
所以这是我的 build.gradle:
plugins {
id 'java-library'
id 'groovy'
id 'eclipse'
id 'application'
id 'java'
}
mainClassName = 'core.App'
group 'Project'
version '1.0'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.codehaus.groovy:groovy-all:2.5.8'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
// these seemed to do the trick for a simple "Java project"
// ... but Gradle seems to want something else (?)
implementation "org.openjfx:javafx-base:11:${platform}"
implementation "org.openjfx:javafx-graphics:11:${platform}"
implementation "org.openjfx:javafx-controls:11:${platform}"
implementation "org.openjfx:javafx-fxml:11:${platform}"
}
这是我的申请代码:
import javafx.application.Application
import javafx.stage.Stage
class App extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
println "start...."
}
public static void main(String[] args) {
println "about to launch..."
launch(args);
println "...launched"
}
}
这是我的测试:
class FuncSpec extends Specification {
def "JavaFX should run OK"(){
when:
App app = new App()
then:
true
}
}
Gradle "run" 后终端的完整输出如下:
mike@M17A ~/software projects/eclipse-workspace/GrVocabSearch2019-09 $ ./gradlew run
> Task :run FAILED
Error: JavaFX runtime components are missing, and are required to run this application
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-11-openjdk-amd64/bin/java'' finished with non-zero exit value 1
稍后
按照 José Pereda 对我 build.gradle 中的信件的指示。这就是我在尝试执行 "run" 任务时得到的结果:
> Task :run FAILED
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7 (file:/media/chris/W10%20D%20drive/apps/Chris.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.8/2f1e8ea55e625fe51e85ef35eb067f1d9c61772d/groovy-2.5.8.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Error: class jdk.internal.reflect.NativeMethodAccessorImpl is not a subclass of javafx.application.Application
at javafx.graphics/javafx.application.Application.launch(Application.java:298)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1491)
at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.callStatic(StaticMetaClassSite.java:62)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:196)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:208)
at core.App.main(main.groovy:60)
... 11 more
Exception running application core.App
FAILURE: Build failed with an exception
备注
我相信这不是任何未提及 Gradle 的答案的重复。我已经在正常 Java 运行.
中正常工作了问题原因:
Error: JavaFX runtime components are missing, and are required to run this application
已经回答了很多次(包括 Gradle),但由于您仍在使用 "old" 方法来包含 JavaFX 依赖项,而不是使用 JavaFX 插件,我将解释如何解决这个问题。
错误
如果您查看 Eclipse 的 JavaFX 文档,第 IDE 部分(模块化或非模块化项目),对这个问题有明确的解释:
或者,换句话说,JavaFX 依赖项是模块化的,必须添加到模块路径中。
第一个解
如果您继续阅读,您会立即找到有关如何修复它的说明(前提是您不使用构建工具):
但是,由于您使用的是 Gradle,解决方案必须进行调整才能包含在您的构建文件中。
这是完成的方式,在 使用 JavaFX 插件之前:
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
现在你应该可以 运行:
./gradlew run
顺便说一句,在使用插件之前,您仍然可以看到 here 从文档中引用的 HelloFX 示例的构建。
JavaFX 插件
Gradle 的 JavaFX plugin 正是为了处理构建文件中的所有 "boilerplate code" 而创建的。
如果您现在查看 Eclipse 的文档,部分 Gradle(模块化或非模块化),或相同的更新 sample,您将看到构建文件被简化为:
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
repositories {
mavenCentral()
}
dependencies {
}
javafx {
version = "13"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
mainClassName = 'org.openjfx.MainApp'
在你的情况下,你只需要将其适应你的构建文件,例如:
plugins {
id 'java-library'
id 'groovy'
id 'eclipse'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
mainClassName = 'core.App'
group 'Project'
version '1.0'
sourceCompatibility = 11
repositories {
mavenCentral()
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.codehaus.groovy:groovy-all:2.5.8'
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
}
javafx {
version = "13"
modules = [ "javafx.controls", "javafx.fxml" ]
}
和运行:
./gradlew run