通过JNLP启动程序会产生安全性异常

时间:2012-04-23 19:37:05

标签: javafx-2

如果我正确阅读了JavaFX部署指南,我应该能够部署一个未签名的应用程序,只要“应用程序需要[没有]提升权限......”。我已将我的应用程序缩减为以下代码:

package fxadhoc;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class FXAdHoc
    extends Application
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        System.out.println( "launch" );
        launch( args );
    }

    @Override
    public void start(Stage stage) throws Exception
    {
        Pane    root    = new Pane();
        root.getChildren().add( new Label( "Testing" ) );
        Scene   scene  = new Scene( root );
        stage.setScene( scene );
        stage.show();
    }
}

当我双击jar文件(由NetBeans创建)时,没有任何反应。当我尝试通过html或jnlp文件(也是由NetBeans创建)启动时,我得到一个安全例外:

Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "javafx.debug" "read")

下面提供了完整的堆栈跟踪。

我正在运行Windows 7并应用了所有最新更新。我已经下载了最新版本的NetBeans(7.1.1),它配备了最新版本的JavaFX。我已经下载了JavaFX示例,它们运行正常。 (如果你很好奇,我尝试自我签名应用程序并获得异常“ava.lang.RuntimeException:java.lang.UnsatisfiedLinkError:无法加载库:C:\ Users \ jack \ Documents \ NetBeansProjects \ FXAdHoc \ DIST \ BIN \ mat.dll“)。当我在Linux(再次使用NetBeans 7.1.1)上构建时,我得到了相同的例外。

谁能告诉我我缺少什么?感谢...

异常的完整堆栈跟踪:

java.lang.RuntimeException: Application launch error
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:104)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ExceptionInInitializerError
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:140)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:27)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:97)
    ... 1 more
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "javafx.debug" "read")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
    at java.lang.System.getProperty(Unknown Source)
    at com.sun.javafx.runtime.SystemProperties.getProperty(SystemProperties.java:178)
    at com.sun.javafx.runtime.SystemProperties$1.run(SystemProperties.java:67)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.runtime.SystemProperties.<clinit>(SystemProperties.java:62)
    ... 4 more

1 个答案:

答案 0 :(得分:1)

显然我有三个不同的问题;如果我有任何错误,请纠正我。

  1. 应该可以部署一个未签名的jar文件,但你不能。我相信这是一个众所周知的问题。
  2. 下载和安装JavaFX运行时不会自动使其从路径中可用。 (当我无法运行自己的代码时,我不知道为什么我可以运行这些示例,但是我必须弄明白。)在我的路径中放置"...\JavaFX 2.o runtime\bin"会使我的“mat.dll找不到“问题。大概将包含libmat.so的目录放到我的Linux系统的路径上也可以解决问题。
  3. 当我尝试不同的方法来解决问题时,即使我的jar文件已签名,我偶尔也会遇到“未签名的资源”异常。我相信这是一个已知的Java问题,至少可以回到1.4。解决方案是禁用缓存临时文件(Windows control panel/java/general/settings)。请注意,我读到的一些评论说启用缓存是解决问题的方法。