JavaFX和外部JAR

exception jar javafx javafx-2

4143 观看

4回复

435 作者的声誉

我正在尝试部署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应用程序引用了外部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的类中的静态块引起的>

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

我还尝试使用相同的证书签署外部jar和javafx jar,但未成功。

作者: troger19 的来源 发布者: 2012 年 1 月 31 日

回应 (4)


0

30219 作者的声誉

通过jnlp判断,打开后并没有重新创建jnlp Unrestricted access。尝试Clean and Build手动运行下一个标记或将其添加到您的jnlp中:

<security>
  <all-permissions/>
</security>
作者: Sergey Grinev 发布者: 31.01.2012 11:26

3

118345 作者的声誉

如果使用的是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生成的自签名证书。

请注意,执行此操作后,用户现在将在使用您的应用程序时看到“信息”和“警报”框,因为该应用程序要求增加对普通网页的特权。


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

ExceptionInInitializerError引发以指示在评估静态初始化程序或静态变量的初始化程序期间发生了异常。找到了包含引发错误的类文件的Jar,并开始加载该类,但由于其静态变量或构造函数遇到错误,因此无法完成加载。

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


System.getProperties()不会在未签名的applet中返回所需的属性-只会返回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从根文件系统中读取文件,并确保读取不会失败。

作者: jewelsea 发布者: 01.02.2012 01:41

2

435 作者的声誉

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

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

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

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

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

作者: troger19 发布者: 06.02.2012 01:42

0

12566 作者的声誉

我遇到过类似的情况..我不确切知道哪种解决方案可以为您提供帮助..所以我将列出所有解决方案:

1-确保您正在使用的jar已签名并且签名有效..您可以为此目的使用jarsigner ..因为如果您使用的jar已过期,.app将在Web上崩溃。如果有一个罐子签名并过期。只需从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>

告诉应用程序哪个是您的应用程序类非常重要..我不知道为什么..但是我在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+'
        },
        {}
    );
}

希望对您或任何面临相同问题的人有所帮助..

祝好运

作者: Maher Abuthraa 发布者: 13.06.2013 04:26
32x32