当前位置: 首页 > 知识库问答 >
问题:

Java11、JavaFX、Gradle、Eclipse、严重故障消息

姚向晨
2023-03-14

操作系统:Linux Mint 18.3,Eclipse“2019-06”。使用Gradle 5.4的Gradle包装器。

昨天,我花了大约4个小时试图在Eclipse中组合一个项目,当使用Java11时,这个项目实际上会运行并显示一个JavaFX场景。由于这里的帮助,我最终还是做到了。

但这只是Eclipse中一个沼泽标准的“Java项目”。我实际上需要做的是开发一个Gradle项目,使用Groovy作为主要语言。

再一次,我从同一位先生JoséPereda那里找到了这个答案。在下面的测试中,这是一个渐变的“构建”OK。但是,当我使用Gradle“application”插件的任务“run”时,我收到了一条令人讨厌的消息:“错误:JavaFX运行时组件丢失,运行此应用程序需要这些组件”。无论是从Eclipse内部运行还是从终端运行,我都会得到这个结果。

这就是我的身材。格拉德尔:

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

渐变“运行”后终端的全输出如下:

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)的指示,在我的身材中做到了这一点。格拉德尔。这就是我尝试执行“运行”任务时得到的结果:

> Task :run FAILED
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (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$1
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

我相信这不是一个没有提到格拉德的答案的复制品。我已经在正常的Java运行中实现了这一点。

共有1个答案

巴星华
2023-03-14

问题的原因是:

错误:缺少JavaFX运行时组件,需要运行此应用程序

已经回答了很多次(包括Gradle),但是因为您仍然使用“旧”方法来包含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

顺便说一下,在使用插件之前,您仍然可以在这里看到从文档中引用的HelloFX示例的构建。

JavaFX插件

Gradle的JavaFX插件的创建正是为了处理构建文件中的所有“样板代码”。

如果您现在查看Eclipse文档、Gradle(模块化或非模块化)部分或相同的更新示例,您将看到构建文件简化为:

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
 类似资料:
  • 每当我试图运行我的GUI时,我在Eclipse WindowBuilder中都会得到奇怪的结果,左上角的区域出现了错误的文本(我真的不知道该怎么称呼这个问题)。我试着到处搜索,但显然没有其他人遇到这个问题。 图像问题:显示显示为Displa,“搜索”被置乱。 问题图片: 我试着创建一个新项目,试着重新安装eclipse,删除我所有的eclipse元文件,重新下载WindowBuilder,甚至从我

  • 我们正在用Adopt JDK11和IntelliJ使用Gradle开发一个JavaFX11应用程序。最后,我们需要一个用于windows的EXE文件(该应用程序仅为windows设计)。在第一次尝试中,我们也使用了gradle中的launch4J,由于以下问题,我们也可以使用BAT文件,我们可以迁移到exe文件。 所以我们的主要目标和问题是,如何才能创建一个可执行的jar文件。 我们进行了几次尝试

  • 我正在使用apache CXF(Spring启动)来开发我的肥皂服务器。在这里,我需要在我的肥皂故障拦截器中记录故障消息,就像在任何肥皂客户端中显示的那样(例如:肥皂UI)。我如何在我的故障拦截器中记录相同的输出?现在它只是显示异常详细信息 输入 输出(在肥皂客户端中显示) UserNotfindException是代码中抛出的自定义异常 我的定制拦截器代码

  • Webpack 的配置比较复杂,很容出现错误,下面是一些通常的故障处理手段。 一般情况下,webpack 如果出问题,会打印一些简单的错误信息,比如模块没有找到。我们还可以通过参数 --display-error-details 来打印错误详情。 $ webpack --display-error-details Hash: a40fbc6d852c51fceadb Version: webpa

  • 初始设置 在创建并启动新的 Serene 应用程序之后,不能显示登录页,而当你打开浏览器控制台,却得到一条错误消息:找不到 Template.LoginPanel: 你可能使用了无效的解决方案名称,如 MyProject.Something (包含点’.’)。 当项目以这种方式命名时,模板系统将不能定位模板。 请不要在解决方案名称中使用点符号(’.’),如果必须使用点符号,可在创建解决方案之后再重

  • 有人能帮我吗?我尝试使用Firepath进行正确的Xpath,但是它给我的代码在我看来是不正确的。示例中的第一行是提供的。 在这里我想检查之间的文本是否大于或等于1 另一个是: 在这里,我想检查div类公共结果是否已生成,1项等于1个公共结果