【问题标题】:JavaFX and external JARsJavaFX 和外部 JAR
【发布时间】:2012-02-22 23:03:54
【问题描述】:

我正在尝试部署 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。我还在项目属性中使用不受限制的访问。我也知道这个话题JavaFx 2.0 application referencing external jars,但它对我不起作用。 当我从 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中的类中的静态块引起的>

String osName= (String) System.getProperties().get("os.name");

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

【问题讨论】:

  • 能否请您添加 NetBeans 为您的 JavaFX 项目生成的 .jnlp 文件。

标签: exception jar javafx javafx-2


【解决方案1】:

如果您使用的是 NetBeans 7.1,则需要将您的 NetBeans 更新到最新的夜间版本http://bits.netbeans.org/download/trunk/nightly/latest/

早期版本的 NetBeans 有一个错误打包 jar 文件 http://netbeans.org/bugzilla/show_bug.cgi?id=205844

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

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

  1. 在 NetBeans 中右键单击您的项目。
  2. 选择构建 |部署
  3. 检查请求无限制访问。
  4. 如果您有来自 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" 未标记为安全敏感。要查看您可以从 Applet 请求和不能请求哪些属性,请参阅:http://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html。另请注意,未签名的小程序无法设置任何系统属性。


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

【讨论】:

  • 你好。我从您的链接安装了新版本的 Netbeans,但没有成功。问题依然存在。在清单中,我引用了我的 jar,并且我之前也签署了我的应用程序,因为没有签名我什至无法从数据库数据中填充表。这里是清单文件>Manifest-Version: 1.0 JavaFX-Version: 2.0 implementation-title: JavaFXSklad2 implementation-version: 1.0 JavaFX-Application-Class: md.MainMenu JavaFX-Class-Path: lib/common.jar lib/ifxjdbc.jar lib/infra.jar lib/jd awt.jar lib/toplink.jar lib/weblogic.jar 创建者:JavaFX Packager
  • 更新了答案以包含有关静态初始化错误的信息以及它们与ClassNotFoundException 的关系。
  • 我想,问题是,我无法从浏览器访问系统属性。此代码位于 jar 'String osName= (String) System.getProperties().get("os.name");' 中的静态块中并且因为 osName 为 NULL,构造函数失败。解决方案可能是签名 jar 文件,我想我签名正确,但仍然是指向 System.getProperties 的空指针并失败。
【解决方案2】:

对不起,我确实误导了你一点。问题是,为什么我的应用程序在 Netbeans 下而不在浏览器中工作,这不是我 jar 中静态块中的这一行:

String osName = (String) System.getProperties().get("os.name");

在 Netbeans (windows Xp) 中返回正确值,但在浏览器中返回 Null。但是当我把代码稍微改成这个的时候>

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

它也在浏览器中返回正确的值。所以它与外部 jar 或签署应用程序无关。问题仍然存在,因为外部 jar 是我们的 Java 基础设施的一部分,所以我不能直接更改代码,但这将是另一个话题 :)

【讨论】:

    【解决方案3】:

    根据 jnlp 判断,您在打开 Unrestricted access 后没有重新创建 jnlp。尝试运行Clean and Build 或手动将下一个标签添加到您的 jnlp:

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

    【讨论】:

      【解决方案4】:

      我遇到过类似的情况..我不知道哪种解决方案对您有帮助..所以我将它们全部列出:

      1-确保您使用的 jar 已签名并且签名有效..您可以为此目的使用 jarsigner..因为如果您使用的 jar 已过期..应用程序将在@web.xml 崩溃。如果有一个 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>
      

      告诉app哪个是你的应用程序类很重要..我不知道为什么..但我在JavaFX的早期版本中找到了这个结构,它解决了我的问题..

      3-如果您使用的是 webPage 而不是通用的 .. 所以只需检查 JNLP_content 序列是否相同 .. 因为每次向项目添加/删除 jar 时,序列都会更改。请考虑检查 URL。 . 我的意思是 HTML 中的这一部分:

       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+'
              },
              {}
          );
      }
      

      希望这会帮助你或任何面临同样问题的人..

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-08
        • 2015-10-15
        • 1970-01-01
        • 2015-10-21
        • 2019-05-21
        • 2013-09-19
        • 2018-04-25
        • 2019-05-27
        相关资源
        最近更新 更多