我想在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-8
和openjfx 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
协议访问它们。