我知道这个问题已经发布了,但是我仔细研究了一下,我不能使它工作。这是我的配置,代码和运行时异常。简而言之,这是我得到的例外情况:无法访问类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
所以你的配置有很多问题。这些是我能确定的,希望没有更多的(我认为我不能帮助你解决所有的环境问题):
- 你指定了
--add-exports
作为程序的参数,而不是虚拟机选项。
- 要了解这个问题以及如何修复它,请参见:如何在IntelliJ IDEA中设置JVM参数?
- 你的代码是在一个命名的模块,而不是一个未命名的模块:
- 您需要在命令行 中导出到
com.ittopics.message_log_demo
,而不是ALL-UNNAMED
。- 你有一个
module-info.java
文件,需要JavaFX模块已经和你的应用程序运行的-p
选项配置模块路径(看看什么想法实际用于java命令行),所以它可以找到这些模块(由maven下载,而不是JavaFX SDK下载),你有,但是,你也尝试添加到模块路径,从SDK下载额外的模块。
- 不需要
"--module-pathc:UsersUserjavafx-sdk-17.0.0.1lib"
- 即使有,也需要在
--module-path
后面加空格 - 我不知道Windows上参数的引用规则,所以我不确定在这种情况下是否需要它们(或会破坏某些东西)。
- 您已经需要在
module-info.java
文件中需要的模块。
- 您不需要在命令行中也使用
--add-modules javafx.web,javafx.fxml,javafx.base
。
- 你的
add-exports
参数是错误的
您的问题说它使用
-add-exports
,尽管这可能是您在询问问题时所做的复制粘贴错误。--add-exports
是必需的(注意前缀中有两个-
字符)。
在
add-exports
之后有一个=
,不应该。应该是:--add-exports javafx.web/com.sun.javafx.webkit=com.ittopics.message_log_demo
不要使用JavaFX的早期访问版本,将依赖项中使用的版本从
17-ea+11
更改为17.0.0.1
或其他稳定版本。发布代码时,请尽量使其最小化(包括依赖项和模块描述符信息)
- 尝试解决导入十个不同库的问题要困难得多,而仅为该测试导入单个所需的直接依赖库(
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支持提交一个特性请求。