Exception JavaFX和外部jar

Exception JavaFX和外部jar,exception,jar,javafx,javafx-2,Exception,Jar,Javafx,Javafx 2,我正在尝试部署JavaFX应用程序,但当我在浏览器中运行它时,它似乎无法在外部jar文件中找到类 java.lang.RuntimeException: java.lang.ExceptionInInitializerError Caused by: java.lang.ExceptionInInitializerError at common.bo.property.TextAttributeProp.checkLimit(TextAttributeProp.java:125) 我的lib

我正在尝试部署JavaFX应用程序,但当我在浏览器中运行它时,它似乎无法在外部jar文件中找到类

java.lang.RuntimeException: java.lang.ExceptionInInitializerError

Caused by: java.lang.ExceptionInInitializerError
at common.bo.property.TextAttributeProp.checkLimit(TextAttributeProp.java:125)
我的lib文件夹和类路径中有common.jar。我还在项目属性中使用无限制访问。我也知道这个话题,但它不适合我。 当我从Netbeans运行它时,一切正常。但在浏览器中,它不会在外部JAR中初始化类。你能帮帮我吗。 多谢各位

jnlp文件在这里

 <?xml version="1.0" encoding="utf-8"?>
    <jnlp spec="1.0" xmlns:jfx="http://javafx.com" href="JavaFXSklad2.jnlp">
    <information>
    <title>JavaFXSklad2</title>
    <vendor>xxx</vendor>
    <description>Sample JavaFX 2.0 application.</description>
    <offline-allowed/>
    </information>
    <resources os="Windows">
    <jfx:javafx-runtime version="2.0+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp"/>
    </resources>
  <resources>
     <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
         <jar href="JavaFXSklad2.jar" size="164987" download="eager" />
         <jar href="lib/common.jar" size="965131" download="eager" />
        <jar href="lib/ifxjdbc.jar" size="705534" download="eager" />
        <jar href="lib/infra.jar" size="588915" download="eager" />
    <jar href="lib/jdawt.jar" size="726475" download="eager" />
    <jar href="lib/toplink.jar" size="1450414" download="eager" />
    <jar href="lib/weblogic.jar" size="55582010" download="eager" />
      </resources>
    <security>
      <all-permissions/>
    </security>
      <applet-desc  width="800" height="600" main-class="com.javafx.main.NoJavaFXFallback"  name="JavaFXSklad2" />
  <jfx:javafx-desc  width="800" height="600" main-class="md.MainMenu"  name="JavaFXSklad2" />
  <update check="background"/> 
    </jnlp>

我还尝试使用相同的证书对外部jar和JavaFXJAR进行签名,但没有成功

从jnlp判断,您在打开
无限制访问后没有重新创建jnlp
。尝试运行
Clean and Build
或手动向jnlp添加下一个标记:

<security>
  <all-permissions/>
</security>

如果您使用的是NetBeans 7.1,则需要将NetBeans更新到最新的夜间版本

早期版本的NetBeans在打包jar文件时有一个错误

您可以通过取消对应用程序的jar文件的归档并检查其META-INF/MANIFEST.MF文件是否包含对外部jar文件的引用来查看NetBeans生成的包是否存在此错误

看起来您正在使用的JAR(如Toplink、jdbc和WebLogic)需要高于未签名应用程序可用的安全权限,因此您还需要按照Sergey的建议请求进一步的安全权限,并对应用程序进行签名。为此:

  • 右键单击NetBeans中的项目
  • 选择构建|部署
  • 检查请求无限制访问
  • 如果您有来自CA的签名证书,请单击编辑。。。按钮,否则只接受默认的NetBeans生成的自签名证书
  • 请注意,一旦您这样做,用户现在将在使用您的应用程序时获得信息和警报框,因为应用程序正在请求比普通网页更高的权限


    在Java中,如果类的静态初始化失败,则即使该类可用且位于类路径上,类加载也将无法完成。这意味着对该类的第一次引用将生成一个
    ExceptionInInitializerError
    ,而对该类的后续引用将生成一个通常具有误导性的
    ClassNotFoundException

    ExceptionInInitializerError
    被抛出,以指示在计算静态初始值设定项或静态变量的初始值设定项期间发生异常。找到了包含引发错误的类文件的Jar,并开始加载该类,但无法完成,因为在其静态变量或构造函数中遇到了错误

    可疑代码可能是
    TextAttributeProp.checkLimit(TextAttributeProp.java:125)
    ,尽管问题的根本原因可能在其他地方。检查TextAttributeProp静态代码正在执行的操作,并将静态初始化方法包装在try-catch块中,以获取更多调试信息、采取回退操作或忽略静态初始化错误


    System.getProperties()
    不会返回未签名小程序中所需的属性-它只会返回null。然后,尝试在静态初始值设定项中取消引用此null值,该初始值设定项生成NullPointerException,并导致类加载失败,随后对该类的引用出现ClassNotFoundException

    如果您通过
    System.getProperty(“os.name”)
    直接获取属性
    “os.name”
    ,而不是获取所有系统属性,那么它会起作用,因为
    “os.name”
    未标记为安全敏感。要查看可以和不能从小程序请求哪些属性,请参阅:。还要注意,未签名的小程序不能设置任何系统属性



    如果应用程序已正确签名,则应该能够获取和设置所需的任何系统属性。如果您不能做到这一点,那么您可以针对JavaFX浏览器插件在提交一个bug。首先,通过尝试执行其他需要提升权限的操作来检查您的应用程序是否已正确签名,例如,从已签名的小程序中读取根文件系统中的文件,并确保读取不会失败。

    抱歉,伙计们,我确实有点误导了您。问题是,为什么我的应用程序在Netbeans和浏览器下工作,而不是我的jar中的静态块中的这一行:

    String osName = (String) System.getProperties().get("os.name");
    
    在Netbeans(windows Xp)中返回正确的值,但在浏览器中返回空值。但当我将代码稍微更改为此>

     String osName = (String) System.getProperty("os.name");
    

    它在浏览器中也返回正确的值。因此,它与外部JAR或对应用程序进行签名无关。问题仍然存在,因为外部JAR是我们的语料库java基础设施的一部分,所以我无法直接更改代码,但这将是另一个主题:)

    我面临类似的情况。。我不知道哪种解决方案对你有帮助。。因此,我将列出所有这些:

    1-确保您使用的jar已签名且签名有效。。为此,您可以使用jarsigner。。因为如果你用的罐子过期了。。应用程序将在@web上崩溃。如果有一个jar已签名并过期。只需从META-INF中删除所有文件即可。(jar是zip文件,顺便说一句)

    2-我看到了你的JNLP。。您需要为应用程序类添加此属性:main=“true”,这样您的应用程序将:

    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="JavaFXSklad2.jar" main="true" size="164987" download="eager" />
        <jar href="lib/common.jar" size="965131" download="eager" />
        <jar href="lib/ifxjdbc.jar" size="705534" download="eager" />
        <jar href="lib/infra.jar" size="588915" download="eager" />
        <jar href="lib/jdawt.jar" size="726475" download="eager" />
        <jar href="lib/toplink.jar" size="1450414" download="eager" />
        <jar href="lib/weblogic.jar" size="55582010" download="eager" />
    </resources>
    
    希望这能帮助你或任何面临同样问题的人


    祝您好运

    您能添加NetBeans为您的JavaFX项目生成的
    .jnlp
    文件吗。我从您的链接安装了新版本的Netbeans,但没有成功。问题依然存在。在manifest中,我引用了我的jar,并且我之前也对我的应用程序进行了签名,因为如果不进行签名,我甚至无法从数据库数据填充表。下面是清单文件>清单版本:1.0 JavaFX版本:2.0实现标题:JavaFXSklad2实现版本:1.0 JavaFX应用程序类:
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="JavaFXSklad2.jar" main="true" size="164987" download="eager" />
        <jar href="lib/common.jar" size="965131" download="eager" />
        <jar href="lib/ifxjdbc.jar" size="705534" download="eager" />
        <jar href="lib/infra.jar" size="588915" download="eager" />
        <jar href="lib/jdawt.jar" size="726475" download="eager" />
        <jar href="lib/toplink.jar" size="1450414" download="eager" />
        <jar href="lib/weblogic.jar" size="55582010" download="eager" />
    </resources>
    
     function javafxEmbed() {
        dtjava.embed(
            {
                url : 'BSigner_v1.5_release.jnlp',
                placeholder : 'javafx-app-placeholder',
                width : 500,
                height : 100,
                jnlp_content : 'PD94bWwgd0iYnNwc2lnbmVyX3YxLnBrZzRfcmVsZWFzZS5NYWluIiAgbmFtZT0iQlNQU2lnbmVyX3YxLjVfcmVsZWFzZSIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo='
            },
            {
                javafx : '2.2+'
            },
            {}
        );
    }