我有一个需要访问互联网的Java应用程序,因为它通过WebView JavaFX组件嵌入了Web浏览器。
如果应用程序未打包在Jar中,则执行时没有问题。 但是,当打包在Jar中时,它无法再访问Internet(例如,它无法加载所需的远程Javascript文件,例如JQuery)。
我尝试用以下方法修复它与jar的签名:
jarsigner myjar myalias
命令成功,但有以下警告:
警告:签名者证书将在六个月内到期。没有 提供了-tsa或-tsacert,这个jar没有带时间戳。如果没有时间戳,用户可能无法在此之后验证此jar 签署人证书的到期日期(2014-07-08)或任何未来之后 撤销日期。
但是,应用程序仍然无法访问Internet(嵌入式浏览器仍无法加载远程脚本文件)。 我应该以其他方式签名吗?可能包括来自认可的证书颁发机构的证书?
我还在~/.java.policy
文件中配置了权限,如下所示:
keystore "file:<userpath>/.keystore", "jks";
grant signedBy "myalias" {
permission java.security.AllPermission;
};
我正在尝试OSX 10.9.2和Java 1.8.0-b132
更新
事实证明,如果应用程序嵌入到Jar中,嵌入式浏览器的执行方式会有所不同,这超出了安全权限。
我不知道这是什么原因,但如果你不知道,这会导致你得出各种错误的结论。可能是一个讨厌的小虫。
例如,我观察到的一件事是,当没有打包在Jar中时,开始像这样的嵌入式网页工作正常:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
...
但是当打包在Jar中时,这给了我一些问题(可能是xhtml1-strict被强制执行)所以我不得不用一个简单的<html>
标签替换它。
这不是唯一不同的行为,而是给我带来问题的主要因素。
答案 0 :(得分:1)
更多信息会很棒,您是否尝试使用原生包装进行部署,是否使用了webstart等。
无论如何,基于你的问题,我建议你看看让Netbeans帮你签名等。
我更喜欢创建一个基于FXML的应用程序,就像代码和代码一样。界面保持独立。在这种情况下,我只是直接投入一些HTML。
我使用WebView部署了许多JavaFX应用程序没有问题。如果您在本地部署,我不担心此时证书即将到期,除非您使用的是webstart。
这里有一些工作正常的示例代码,它使用WebView&amp;访问互联网获取jQuery。
主要班级:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author Sam
*/
public class WebViewTestJDK8 extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
控制器:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class FXMLDocumentController implements Initializable {
@FXML
private WebView webView;
@Override
public void initialize(URL url, ResourceBundle rb) {
Platform.runLater(new Runnable() {
@Override
public void run() {
String html = "<html>\n"
+ "<head>\n"
+ "<title>jQuery Hello World</title>\n"
+ " \n"
+ "<script type=\"text/javascript\" src=\"http://code.jquery.com/jquery-1.2.6.min.js\"></script>\n"
+ " \n"
+ "</head>\n"
+ " \n"
+ "<body>\n"
+ " \n"
+ "<script type=\"text/javascript\">\n"
+ " \n"
+ "$(document).ready(function(){\n"
+ " $(\"#msgid\").html(\"Hello World by JQuery\");\n"
+ "});\n"
+ " \n"
+ "</script>\n"
+ " \n"
+ "Hello World by HTML\n"
+ " \n"
+ "<div id=\"msgid\">\n"
+ "</div>\n"
+ " \n"
+ "</body>\n"
+ "</html>";
webView.getEngine().loadContent(html);
}
});
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>
<AnchorPane id="AnchorPane" fx:id="pane" prefHeight="367.0" prefWidth="446.0" xmlns:fx="http://javafx.com/fxml" fx:controller="webviewtest.jdk8.FXMLDocumentController">
<children>
<WebView fx:id="webView" prefHeight="367.0" prefWidth="446.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
希望它有所帮助!