【问题标题】:Java WebView generate an exception on Windows XPJava WebView 在 Windows XP 上生成异常
【发布时间】:2017-02-04 18:24:28
【问题描述】:

这是我在这里的第一个问题,所以我希望清楚。 我正在开发一个简单的 JavaFX 应用程序,它唯一要做的就是显示一个 Web 用户界面。 一切似乎都很好,我从 Eclipse 导出了 Runnable JAR 文件,并在 Window 10 和 7 上对其进行了测试,但是当我将 jar 放在 Window XP OS 上时,我有以下内容:

    Exception in Application start method
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm
pl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(
LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.UnsatisfiedLinkError: Invalid URL for class: rsrc:com/sun/g
lass/utils/NativeLibLoader.class
        at com.sun.glass.utils.NativeLibLoader.loadLibraryFullPath(NativeLibLoad
er.java:162)
        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoad
er.java:94)
        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:
39)
        at com.sun.webkit.WebPage.lambda$static$39(WebPage.java:130)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.webkit.WebPage.<clinit>(WebPage.java:129)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:879)
        at javafx.scene.web.WebEngine.<init>(WebEngine.java:866)
        at javafx.scene.web.WebView.<init>(WebView.java:273)
        at application.Main.start(Main.java:30)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162
(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Platfor
mImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.
java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformI
mpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.ja
va:191)
        ... 1 more

这是我的代码:

package application;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;


public class Main extends Application {
    @Override
    public void start(Stage stage)
    {
        stage.setMinWidth( 800 );
        stage.setMinHeight( 600 );
        stage.setMaximized( true );
        Scene scene = new Scene(new Group());

        WebView browser = new WebView();
        WebEngine we = browser.getEngine();

        //setting personalized context menu
        browser.setContextMenuEnabled( false );
        //createContextMenu( browser );

        //preventing bug when maximmizing
        stage.maximizedProperty().addListener(new ChangeListener<Boolean>()
        {
            @Override
            public void changed( ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1 )
            {
                System.out.println("maximized:" + t1.booleanValue());
            }
        });

        //intercepting javascript alert
        browser.getEngine().setOnAlert( new EventHandler<WebEvent<String>>()
        {

            @Override
            public void handle(WebEvent<String> e)
            {
                Alert alert = new Alert( AlertType.WARNING );
                alert.setTitle( "MyApp" );
                alert.setHeaderText( null );
                alert.setContentText( e.getData() );
                alert.showAndWait();
                System.out.println("JS alert() message: " + e.getData() );
            }

        });

        //intercepting javascript confirm
        browser.getEngine().setConfirmHandler( new Callback<String, Boolean>()
        {
            @Override
            public Boolean call( String s )
            {
                Boolean ret;
                ButtonType ok, cancel;

                ok = new ButtonType( "Ok" );
                cancel = new ButtonType( "Abort" );

                Alert alert = new Alert( AlertType.CONFIRMATION );
                alert.setTitle( "SameLAB" );
                alert.setHeaderText( s );
                alert.setContentText( null );
                alert.getButtonTypes().setAll( ok, cancel );
                alert.showAndWait();

                if( alert.getResult() == ok )
                    ret = true;
                else
                    ret = false;

                return ret;
            }
        });


        ScrollPane sp = new ScrollPane();
        sp.setFitToWidth( true );
        sp.setFitToHeight( true );
        sp.setContent(browser);

        //loading and showing content
        we.load("https://www.google.it/");
        scene.setRoot( sp );
        stage.setScene( scene );
        stage.show();
    }

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

希望有人能帮帮我,谢谢!

【问题讨论】:

  • WinXP 机器上安装了哪个版本的 Java?
  • @JimGarrison 在 WinXP 机器上我将 Java 升级到最后一个版本:1.8.0_121,当然我使用相对 JRE(1.8.0_121 32 位)生成了 jar 文件
  • @GKR 谢谢你,我会留意的!
  • Windows XP 不是 Java 支持的平台。 (事实上​​,微软也不再支持 Windows XP。)

标签: java eclipse javafx webview


【解决方案1】:

我今天升级到上一个 JDK 121 后遇到了这个问题。 早期版本的 JDK 122 也存在同样的问题。

至于现在 WebView 和 HTMLEditor 在使用 JDK 77 时工作正常(可能还有一些更高的版本(如下面的链接所述 - 102),但我没有检查它)。 问题在于加载库 NativeLibLoader.loadLibrary("jfxwebkit"); 有一些模糊的建议表明一些新的 Microsoft Visual C++ Redistributables 可能会有所帮助。

已编辑。 它已经在错误报告中:https://bugs.openjdk.java.net/browse/JDK-8170084 并且,唉,以解决方案关闭:“不会修复”。

因此,剩下一个选择 - 为 Windows XP 提供捆绑的 JRE 版本 1.8.0_102 或更低版本。

【讨论】:

  • 非常感谢 RoK,我会试试你的解决方案。也许它会导致有点没用,因为我认为 W XP 中的 WebView 将使用 Internet Explorer 8,所以不支持引导程序,也不支持 jquery,我会看到,但感谢您的帮助:)
  • 抱歉,Matt Chad,我在项目中弄乱了 JDK 版本,而 System.load 的第二个解决方法实际上不起作用。仅首先使用捆绑的 JRE。我推荐 Launch4j 包装器。
【解决方案2】:

因此,剩下一个选项 - 为 Windows XP 提供捆绑的 JRE 版本 1.8.0_102 或更低版本。另一个临时的脏选项:将您的应用程序与 1.8.0_102 中的 jfxwebkit.dll 捆绑在一起,并在创建 WebView 实例之前在代码中的某个位置添加(例如,在 start(Stage primaryStage) 方法中)

if ("Windows XP".equals(System.getProperty("os.name"))){ 
System.load(ABS_PATH_TO_JFXWEBKIT_DLL + "\\jfxwebkit.dll");}

【讨论】:

  • 会试试的!谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2012-08-02
  • 2014-05-31
  • 2013-09-02
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
相关资源
最近更新 更多