如何让JavaFx WebEngine详细报错?

How to get the JavaFx WebEngine to report errors in details?

我知道这个问题已经发布了,但我仔细研究了它,但我无法解决这个问题。所以这是我的配置、代码和我得到的运行时异常。 简而言之,这是我得到的例外: 无法访问 class com.sun.javafx.webkit.WebConsoleListener(在模块 javafx.web 中),因为模块 javafx.web 不导出 com.sun.javafx.webkit

更详尽:

使用 Maven 的 IntelliJ Idea Java openjdk-17 模块-info.java

module com.ittopics.message_log_demo {
requires javafx.controls;
requires javafx.fxml;

requires org.controlsfx.controls;
requires com.dlsc.formsfx;
requires validatorfx;
requires javafx.web;

opens com.ittopics.message_log_demo to javafx.fxml, javafx.web;
exports com.ittopics.message_log_demo;
}

java代码:

package com.ittopics.message_log_demo;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


import com.sun.javafx.webkit.WebConsoleListener;

public class Main extends Application {


@Override
public void start(final Stage pStage) {
       initStage(pStage);
}

private void initStage(Stage pStage){

    WebView lWebView = new WebView();
    WebEngine lWebViewEngine = lWebView.getEngine();

    lWebViewEngine.getLoadWorker().exceptionProperty().addListener((ov, t, t1) ->
            System.out.println("Received exception: "+t1.getMessage())
    );

    WebConsoleListener.setDefaultListener((webViewReference, message, lineNumber, sourceId) ->
            System.out.println("Console: [" + sourceId + ":" + lineNumber + "] " + message)
    );
   lWebViewEngine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() {
        @Override
        public void changed(ObservableValue<? extends Throwable> ov, Throwable t, Throwable t1) {
            System.out.println("Received exception: "+t1.getMessage());
        }
    });

 


    lWebViewEngine.setOnAlert((EventHandler<WebEvent<String>>) event -> System.out.println(event.getData()));
    
    String lTargetUrl;
    
    lTargetUrl = "file:///C:/Users/User/Documents/index3.html";
    lWebViewEngine.load(lTargetUrl);

    VBox lVBox = new VBox(lWebView);

    pStage.setScene(new Scene(lVBox));
    
    pStage.show();
}


public static void main(String[] args) {
    launch();
}
}

运行 with IntelliJ : (注意参数:-add-exports=javafx.web/com.sun.javafx.webkit=所有未命名的“--module-pathc:\Users\User\javafx-sdk-17.0.0.1\lib”--add-modules javafx.web,javafx.fxml,javafx.base)

C:\Users\User\.jdks\openjdk-17\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\lib\idea_rt.jar=64692:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.2.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\User\.m2\repository\org\openjfx\javafx-controls-ea+11\javafx-controls-17-ea+11.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-graphics-ea+11\javafx-graphics-17-ea+11.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-base-ea+11\javafx-base-17-ea+11.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-fxml-ea+11\javafx-fxml-17-ea+11.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-web-ea+11\javafx-web-17-ea+11.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-media-ea+11\javafx-media-17-ea+11.jar -p C:\Users\User\.m2\repository\org\controlsfx\controlsfx.1.0\controlsfx-11.1.0.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-media-ea+11\javafx-media-17-ea+11-win.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-web-ea+11\javafx-web-17-ea+11-win.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-graphics-ea+11\javafx-graphics-17-ea+11-win.jar;C:\Users\User\.m2\repository\com\dlsc\formsfx\formsfx-core.3.2\formsfx-core-11.3.2.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-controls-ea+11\javafx-controls-17-ea+11-win.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-fxml-ea+11\javafx-fxml-17-ea+11-win.jar;C:\Users\User\IdeaProjects\message_log_demo\target\classes;C:\Users\User\.m2\repository\net\synedra\validatorfx[=12=].1.13\validatorfx-0.1.13.jar;C:\Users\User\.m2\repository\org\openjfx\javafx-base-ea+11\javafx-base-17-ea+11-win.jar -m com.ittopics.message_log_demo/com.ittopics.message_log_demo.Main --add-exports=javafx.web/com.sun.javafx.webkit=ALL-UNNAMED "--module-pathc:\Users\User\javafx-sdk-17.0.0.1\lib\" --add-modules javafx.web,javafx.fxml,javafx.base"
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:467)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:366)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:903)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:198)
    at java.base/java.lang.Thread.run(Thread.java:833)
**Caused by: java.lang.IllegalAccessError: class com.ittopics.message_log_demo.Main (in module com.ittopics.message_log_demo) cannot access class com.sun.javafx.webkit.WebConsoleListener (in module javafx.web) because module javafx.web does not export com.sun.javafx.webkit to module com.ittopics.message_log_demo**
    at com.ittopics.message_log_demo/com.ittopics.message_log_demo.Main.initStage(Main.java:35)
    at com.ittopics.message_log_demo/com.ittopics.message_log_demo.Main.start(Main.java:23)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:849)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:474)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:447)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:446)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:174)
    ... 1 more
Exception running application com.ittopics.message_log_demo.Main

Process finished with exit code 1

问题:我怎样才能摆脱这个异常并查看日志消息

我在对这个设置的回答中添加了一些进一步的解释:

  • In IntelliJ, what the meaning of -- override compiler parameters per module?

答案中也有很多上下文信息:


所以你的配置有很多问题。这些是我可以确定的,希望没有更多(我认为我无法帮助您解决所有环境问题):

  1. 您指定 --add-exports 作为程序的参数而不是 VM 选项。
  • 要了解此问题以及如何修复它,请参阅:
  1. 您的代码在命名模块中,而不是未命名模块中:
  • 您需要在命令行中导出到 com.ittopics.message_log_demo,而不是 ALL-UNNAMED
  1. 您的 module-info.java 文件已经需要 JavaFX 模块,您的应用 运行 带有 -p 选项来配置模块路径(查看实际用于java 命令行),因此它可以找到您拥有的那些模块(由 Maven 下载,而不是 JavaFX SDK 下载),但是,您还尝试将来自 SDK 下载的其他模块添加到模块路径。
  • 你不需要"--module-pathc:\Users\User\javafx-sdk-17.0.0.1\lib"
  • 即使你有,在--module-path
  • 之后也需要一个space
  • 我不知道 Windows 上参数的引用规则,所以我不确定在这种情况下是否需要它们(或者会破坏某些东西)。
  1. 您已经在 module-info.java 文件中需要您需要的模块。
  • 您的命令行中也不需要 --add-modules javafx.web,javafx.fxml,javafx.base
  1. 你的 add-exports 论点是错误的。
  • 你的问题说它使用了 -add-exports,尽管这可能是你在提问时犯的复制粘贴错误。

  • --add-exports 是必需的(注意前缀中的两个 - 字符)。

  1. 你在 add-exports 之后有一个 = 但不应该。应该是:

    --add-exports javafx.web/com.sun.javafx.webkit=com.ittopics.message_log_demo
    
  2. 不要使用 JavaFX 的早期访问版本,将依赖项中使用的版本从 17-ea+11 更改为 17.0.0.1 或其他稳定版本。

  3. 发布代码时,请尽量做到最小化(包括依赖项和模块描述符信息)。

  • 尝试解决导入 10 个不同库的问题比导入仅导入该测试所需的单个直接依赖库的问题要困难得多(javafx.web 模块,因为任何其他需要的模块都将被传递导入) .

请多加小心


即使在您修复设置后:

I ran the example again, using the url provided in your original referenced question: http://it-topics.com/index3.html.

It no longer gives an error for the ResizeObserver, so I guess somebody fixed the website, at least for now.

So, even once you get a WebConsoleListener properly registered and logging it won't log an error for that page anymore.

Note JavaFX itself still doesn't handle the ResizeObserver, so if you use the mozilla test page for ResizeObserver, it will report an error https://mdn.github.io/dom-examples/resize-observer/resize-observer-text.html.

As before, I encourage you to spend the time to follow-up and file a feature request for ResizeObserver support for WebView if that is something you wish to do.