JavaFX和外部JAR

时间:2012-01-31 07:34:17

标签: 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文件夹和classpath中有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>

编辑&gt;最后我意识到,问题是由这行中的jar中的类中的静态块引起的&gt;

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

我也尝试使用相同的cetrificate签署外部罐子和javafx jar,但没有成功。

4 个答案:

答案 0 :(得分:3)

如果您使用的是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生成的程序包是否存在此错误。

看起来您正在使用的jar(像Toplink,jdbc和WebLogic这样的东西)需要比未签名应用程序可用的安全权限更高的安全权限,因此您还需要在Sergey推荐并签署您的应用程序时请求更多安全权限。要做到这一点:

  1. 在NetBeans中右键单击您的项目。
  2. 选择构建|部署
  3. 检查请求无限制访问权。
  4. 如果您拥有来自CA的签名证书,请单击签名证书旁边的“编辑...”按钮,否则只需接受默认的NetBeans生成的自签名证书。
  5. 请注意,一旦执行此操作,用户现在将在使用您的应用程序时获取“信息”和“警报”框,因为该应用程序正在请求比普通网页更多的权限。


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

    抛出

    ExceptionInInitializerError表示在评估静态初始值设定项或静态变量的初始化程序期间发生了异常。找到了包含抛出错误的类文件的Jar,并且开始加载类但由于在静态变量或构造函数中遇到错误而无法完成。

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


    System.getProperties()不会在无符号小程序中返回您想要的属性 - 它只会返回null。然后尝试在静态初始化程序中取消引用此null值,该初始化程序生成NullPointerException并导致类加载失败,并且后续引用该类将导致ClassNotFoundException。

    如果直接通过"os.name"获取属性System.getProperty("os.name")而不是获取所有系统属性,则可以正常运行,因为"os.name"未标记为安全敏感。要查看可以和不能从Applet请求的属性,请参阅:http://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html。另请注意,未签名的小程序无法设置任何系统属性。


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

答案 1 :(得分:2)

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

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

在Netbeans(windows Xp)中返回正确的值,但在浏览器中返回Null。但是,当我稍微将代码更改为此&gt;

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我遇到了类似的情况..我不确切知道哪种解决方案可以帮到你......所以我会列出所有这些:

1-确保您使用的jar已签名且签名有效..您可以使用jarsigner进行此目的..因为如果您使用的jar已过期..应用程序将崩溃@Web。如果有罐子签名并过期。只需从META-INF中删除所有文件。 (jar是zip文件btw)

2 - 我看到你的JNLP ..你需要为应用程序类添加这个属性:main =&#34; true&#34;所以你的意志是:

<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>

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

3-如果您使用的是webPage而不是通用的..所以只需检查JNLP_content序列是否相同..因为每次添加/删除jar到项目时,串口都会被更改.consider检查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+'
        },
        {}
    );
}

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

祝你好运

相关问题