为什么相对URL在jar:file协议(在JavaFX WebView中)不起作用?

时间:2017-12-07 15:09:28

标签: javafx webview jar

我想在Java程序中使用映射,并意识到在JavaFX WebView组件中使用Leaflet。这工作正常,直到我将应用程序和Web资源放入jar存档。然后,我仍然可以加载主页,但如果使用相对路径指定了它们的位置,则无法解析图像,脚本和样式表。

这是一个最小的例子(JavaScript代码不是必需的,只是为了进一步检查):

webfail / Main.java

package webfail;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            WebView root = new WebView();
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();

            WebEngine webEngine = root.getEngine();
            webEngine.load(getClass().getResource("/webfail/home.htm").toExternalForm());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

webfail / home.htm

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title>Home</title>
</head>
<body>
<h1>Home</h1>
<p>Go to <a href="linked.htm">other page</a>.<br />
<script type="text/javascript">
  /* target of hyperlink */
  var links = document.getElementsByTagName("a");
  document.writeln("Link href: "+links[0].href+"<br />");
  /* location of website */
  document.writeln("Location href: "+window.location.href+"<br />");
  /* construct a link with an absolute reference */
  lastSlash = window.location.href.lastIndexOf("/");
  document.writeln("Go to <a href=\""+window.location.href.substr(0,lastSlash+1)+"linked.htm\">other page</a>.<br />")
</script>
<script type="text/javascript" src="test.js"></script>
</p>
</body>
</html>

webfail / test.js

document.writeln("test.js is loaded.<br />");

我遗漏了webfail/linked.htm。它可以是任何html文件。

<小时/> 现在我得到的网页如下所示:

  

主页

     

转到其他页面。
  链接href:file:///some/path/bin/webfail/linked.htm
  位置href:file:///some/path/bin/webfail/home.htm
  转到其他页面。
  test.js已加载。

如果我点击两个链接中的一个,我会进入第二页。但是,如果我将项目导出到jar存档中,我会得到以下结果:

  

主页

     

转到其他页面。
  链接href:linked.htm
  位置href:jar:文件:/some/other/path/WebFail.jar!/webfail/home.htm
  转到其他页面。

可以看出,第一个超链接仅指link.htm,单击时没有任何反应。使用javascript,第二个链接指向jar:file:/some/other/path/WebFail.jar!/webfail/linked.htm,它可以正常工作。

为什么Java会以这种方式运行,原因是什么?它是WebView组件还是jar:file协议的处理程序?这种行为对我来说似乎不合逻辑,特别是因为问题不是从jar存档加载图像/脚本/样式表,而是相对路径的分辨率。

我也想知道在所有Java / JavaFX版本中是否存在该问题。我在Ubuntu 16.04.3上使用openjdk-8openjfx 8包。在这个问题中,似乎作者可以通过相对URL加载JS脚本:JavaFX WebView does not load upper folder script in jar。看来这篇文章的作者javafx 2 webview custom url handler, don't work relative url处理了同样的问题,并通过创建自己的协议处理程序来规避它。有关做什么的更好解释可以在this answer中找到。

目前,我最好的选择似乎是不将我的网络资源包含在jar存档中,以便可以通过file协议访问它们。

0 个答案:

没有答案