如何获得JavaFx WebEngine报告错误的细节?



我知道这个问题已经发布了,但是我仔细研究了一下,我不能使它工作。这是我的配置,代码和运行时异常。简而言之,这是我得到的例外情况:无法访问类com.sun.javafx.webkit.WebConsoleListener(在模块javafx.web中),因为模块javafx.webWeb无法导出com.sun.javafx.webkit

更详尽:

IntelliJ Idea使用MavenJava openjdk-17module-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();
}
}

使用IntelliJ运行:(注意参数:-add-exports=javafx.web/com.sun.javafx。webkit = ALL-UNNAMED"——module-pathc: 用户用户 javafx-sdk-17.0.0.1 lib"——添加模块javafx.web、javafx.fxml javafx.base)

C:UsersUser.jdksopenjdk-17binjava.exe "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2021.2.2libidea_rt.jar=64692:C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2021.2.2bin" -Dfile.encoding=UTF-8 -classpath C:UsersUser.m2repositoryorgopenjfxjavafx-controls17-ea+11javafx-controls-17-ea+11.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-graphics17-ea+11javafx-graphics-17-ea+11.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-base17-ea+11javafx-base-17-ea+11.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-fxml17-ea+11javafx-fxml-17-ea+11.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-web17-ea+11javafx-web-17-ea+11.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-media17-ea+11javafx-media-17-ea+11.jar -p C:UsersUser.m2repositoryorgcontrolsfxcontrolsfx11.1.0controlsfx-11.1.0.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-media17-ea+11javafx-media-17-ea+11-win.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-web17-ea+11javafx-web-17-ea+11-win.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-graphics17-ea+11javafx-graphics-17-ea+11-win.jar;C:UsersUser.m2repositorycomdlscformsfxformsfx-core11.3.2formsfx-core-11.3.2.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-controls17-ea+11javafx-controls-17-ea+11-win.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-fxml17-ea+11javafx-fxml-17-ea+11-win.jar;C:UsersUserIdeaProjectsmessage_log_demotargetclasses;C:UsersUser.m2repositorynetsynedravalidatorfx.1.13validatorfx-0.1.13.jar;C:UsersUser.m2repositoryorgopenjfxjavafx-base17-ea+11javafx-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:UsersUserjavafx-sdk-17.0.0.1lib" --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$2(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$9(LauncherImpl.java:849)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(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$3(WinApplication.java:174)
... 1 more
Exception running application com.ittopics.message_log_demo.Main
Process finished with exit code 1

问题:我怎么能摆脱这个异常,看到日志消息

我对这个设置添加了一些进一步的解释,在对

的回答中:
  • 在IntelliJ中,——override每个模块的编译器参数的含义是什么?

在以下问题的答案中也有很多上下文信息:

  • javafx webview不能正确显示html页面
  • WebConsoleListener IllegalAccessError在JavaFX 12

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

  1. 你指定了--add-exports作为程序的参数,而不是虚拟机选项。
  • 要了解这个问题以及如何修复它,请参见:如何在IntelliJ IDEA中设置JVM参数?
  1. 你的代码是在一个命名的模块,而不是一个未命名的模块:
  • 您需要在命令行
  • 中导出到com.ittopics.message_log_demo,而不是ALL-UNNAMED
  1. 你有一个module-info.java文件,需要JavaFX模块已经和你的应用程序运行的-p选项配置模块路径(看看什么想法实际用于java命令行),所以它可以找到这些模块(由maven下载,而不是JavaFX SDK下载),你有,但是,你也尝试添加到模块路径,从SDK下载额外的模块。
  • 不需要"--module-pathc:UsersUserjavafx-sdk-17.0.0.1lib"
  • 即使有,也需要在--module-path
  • 后面加空格
  • 我不知道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. 发布代码时,请尽量使其最小化(包括依赖项和模块描述符信息)

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

请更加小心。


即使你已经修复了你的设置:

我再次运行示例,使用您原始参考问题中提供的url:http://it-topics.com/index3.html.

它不再给出ResizeObserver的错误,所以我猜有人修复了这个网站,至少现在。

所以,即使你得到一个WebConsoleListener正确注册和日志,它不会再记录一个错误的页面。

注意JavaFX本身仍然不处理ResizeObserver,所以如果你使用mozilla的ResizeObserver测试页面,它会报告一个错误https://mdn.github.io/dom-examples/resize-observer/resize-observer-text.html

和以前一样,我鼓励你花时间跟进,如果你想做的话,为WebView的ResizeObserver支持提交一个特性请求。

相关内容

  • 没有找到相关文章

最新更新