2012-01-31 69 views
2

我想部署JavaFX應用程序,但是當我在瀏覽器中運行它時,它看起來像無法在外部jar文件中找到這些類。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運行它時,一切正常。但在瀏覽器中,它不會初始化外部容器中的類。你可以幫我嗎。 謝謝

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> 

編輯>最後,我意識到,這個問題是由靜態塊類罐中造成了這條線>

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

我也嘗試使用相同的證書籤署外部jar和javafx jar,但沒有成功。

+0

請問您可以添加'.jnlp'文件哪個NetB爲您的JavaFX項目生成的eans。 – 2012-01-31 08:14:40

+0

我把它添加到我的文章 – troger19 2012-01-31 09:30:49

回答

0

通過jnlp來判斷您在打開Unrestricted access後沒有重新創建jnlp。嘗試運行Clean and Build或一個標籤手動添加到您的JNLP:

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

如果您使用的是NetBeans 7.1,你需要更新你的NetBeans到最新nightly版本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. 選擇Build |部署
  3. 檢查請求無限制訪問。
  4. 如果您有來自CA的簽名證書,請單擊簽名證書旁邊的編輯...按鈕,否則僅接受默認的NetBeans生成的自簽名證書。

請注意,一旦你這樣做了,用戶現在將在他們使用你的應用程序時獲得信息和警報框,因爲應用程序正在請求增加的權限,而不是普通網頁的權限。在Java中,如果某個類的靜態初始化失敗,則類加載將無法完成,即使該類可用並且在類路徑上也是如此。這意味着對該課程的第一次引用將生成一個ExceptionInInitializerError,並且後續對該課程的引用將生成,這通常是一種誤導性的,ClassNotFoundException

ExceptionInInitializerError被拋出,指示靜態初始化或靜態變量初始化的評估過程中發生了異常。發現包含拋出錯誤的類文件的Jar,並且類的加載已經開始,但是無法完成,因爲它的靜態變量或構造函數中存在錯誤。

可疑代碼是TextAttributeProp.checkLimit(TextAttributeProp.java:125),雖然你的問題的根本原因可能是在其他地方。檢查TextAttributeProp靜態代碼正在做什麼,並將try靜態初始化方法包裝在try catch塊中以獲取更多調試信息,執行回退操作或忽略靜態初始化錯誤。


System.getProperties()不會回到你想要的屬性在未簽名的Applet - 它只是返回null。然後嘗試在靜態初始化程序中取消引用該空值,該靜態初始化程序會生成NullPointerException,並導致類加載失敗,並隨後引發該類以引發ClassNotFoundException。

如果您直接通過System.getProperty("os.name")獲取屬性"os.name",而不是獲取所有系統屬性,則它可以工作,因爲"os.name"未標記爲安全敏感。要查看您可以和不能從Applet請求的屬性,請參閱:http://docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html。另請注意,未簽名的applet無法設置任何系統屬性。


如果您的應用程序已正確簽名,您應該能夠獲取並設置所需的任何系統屬性。如果你不能這樣做,那麼你可以在http://javafx-jira.kenai.com上提交一個針對JavaFX瀏覽器插件的bug。首先檢查你是否已經正確地簽署了你的應用程序,方法是嘗試執行其他需要提升權限的操作,例如從已簽名的applet中從根文件系統讀取文件,並確保讀取操作不會失敗。

+0

你好。我從你的鏈接安裝新版本的Netbeans,但沒有成功。問題依舊。在清單中,我引用了我的jar,並且我也在之前簽署了我的應用程序,因爲沒有簽名,我甚至無法填充數據庫數據中的表。下面是清單文件>清單-版本:1.0 JavaFX的版本:2.0 實現的標題:JavaFXSklad2 實現的版本:1.0 JavaFX的應用級:md.MainMenu JavaFX的類路徑:LIB/common.jar lib/ifxjdbc.jar lib/infra.jar lib/jd awt.jar lib/toplink.jar lib/weblogic.jar 創建人:JavaFX Packager – troger19 2012-02-01 10:33:31

+0

已更新的答案包括有關靜態初始化錯誤的信息以及它們如何與一個'ClassNotFoundException'。 – jewelsea 2012-02-03 19:54:53

+0

我想,問題是,我無法從瀏覽器訪問系統屬性。此代碼在jar中的靜態塊中'String osName =(String)System.getProperties()。get(「os.name」);'因爲osName是NULL,所以構造函數失敗。解決方案可能是簽名jar文件,我認爲我正確地簽了名,但仍指向System.getProperties的空指針並失敗。 – troger19 2012-02-06 13:00:43

2

對不起,我沒有誤導你一點。這個問題,爲什麼我的應用程序工作的Netbeans下,並在瀏覽器中沒有爲這條線在靜態塊在我的罐子:

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

這Netbeans的(Windows XP中)返回正確的值,但在瀏覽器空。但是,當我稍微更改代碼到這個>

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

它也在瀏覽器中返回正確的值。所以它與外部罐子或簽署應用程序無關。問題仍然存在,因爲外部罐子是我們下一代java基礎設施的一部分,所以我不能直接更改代碼,但這將是另一個主題:)

0

我面臨類似的情況..我不知道確切的解決方案是什麼可以幫助你..所以我會列出他們所有:

1-確保你使用的jar簽名和簽名是有效的..你可以使用jarsigner爲此目的..因爲如果你的jar正在使用已過期..應用程序將崩潰@ web。如果有一個jar簽名並過期。只需從META-INF中刪除所有文件。 (罈子BTW zip文件)

2,我看到你的JNLP ..你需要添加應用程序類此屬性:主要=「真」,所以你會:

<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 serial是否相同..因爲每次添加/刪除罐項目,串行會。考慮檢查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+' 
     }, 
     {} 
    ); 
} 

希望是去幫助你或任何人面臨着同樣的問題..

祝你好運