2013-09-30 56 views
4

我在通過「dist文件夾」中的.jar運行javaFX應用程序時出現問題,後來我通過NetBeans進行了清理和生成項目。javafx在Netbeans IDE之外運行的應用程序

C:\NetBeansProjects\Gestore\dist>java -jar 
Gestore.jar 
log4j:ERROR Could not read configuration file [conf\log4j.properties]. 
java.io.FileNotFoundException: conf\log4j.properties (Impossibile trovare il per 
corso specificato) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurato 
r.java:372) 
     at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator. 
java:403) 
     at gestore.Gestore.<init>(Gestore.java:97) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou 
rce) 
     at java.lang.reflect.Constructor.newInstance(Unknown Source) 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm 
pl.java:276) 
     at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java: 
47) 
     at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) 
     at java.lang.Thread.run(Unknown Source) 
log4j:ERROR Ignoring configuration file [conf\log4j.properties]. 
log4j:WARN No appenders could be found for logger (gestore.Utility). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more in 
fo. 
Exception in Application start method 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at com.javafx.main.Main.launchApp(Main.java:642) 
     at com.javafx.main.Main.main(Main.java:805) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm 
pl.java:403) 
     at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java: 
47) 
     at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.SecurityException: class "javafx.scene.control.Dialogs"'s s 
igner information does not match signer information of other classes in the same 
package 
     at java.lang.ClassLoader.checkCerts(Unknown Source) 
     at java.lang.ClassLoader.preDefineClass(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$100(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at gestore.Gestore.loadEserciziFromDB(Gestore.java:407) 
     at gestore.Gestore.start(Gestore.java:178) 
     at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
     at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) 
     at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179 
) 
     at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176 
) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29 
) 
     at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) 
     ... 1 more 

但是,如果我從netBeans運行項目一切正常。如果我嘗試(稍後在NetBeans中運行)從dist文件夾啓動應用程序,那麼所有工作都是完美的。事實上

C:\NetBeansProjects\Gestore\dist>java -jar 
Gestore.jar 
log4j:ERROR Could not read configuration file [conf\log4j.properties]. 
java.io.FileNotFoundException: conf\log4j.properties (Impossibile trovare il per 
corso specificato) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurato 
r.java:372) 
     at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator. 
java:403) 
     at gestore.Gestore.<init>(Gestore.java:97) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou 
rce) 
     at java.lang.reflect.Constructor.newInstance(Unknown Source) 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm 
pl.java:276) 
     at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java: 
47) 
     at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) 
     at java.lang.Thread.run(Unknown Source) 
log4j:ERROR Ignoring configuration file [conf\log4j.properties]. 
log4j:WARN No appenders could be found for logger (gestore.Utility). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more in 
fo. 

所以我覺得這個問題是由java.lang.SecurityException異常(是的,我知道有一個與log4j屬性的問題)造成的,也許這裏https://github.com/marcojakob/javafx-ui-sandbox/issues/5有一個解決方案,但爲什麼?

+0

您正在使用哪種IDE和構建系統? – kpenrose

+0

NetBeans。由NetBeans提供的構建系統 – pask23

+0

我看到您在發佈該評論後立即使用NetBeans。所以,我假設你使用ant作爲你的構建系統,而不是maven。問題在於ant build不會創建可執行的jar文件。在javafxpackager上尋找構建可執行jar的帖子,或切換到maven並使用zenjava.com上的javafx-maven-plugin。 – kpenrose

回答

1

問題是什麼

javafx-ui-sandbox項目鏈接到已經落後,並且在某些情況下更高的JavaFX版本不兼容。

它是如何

我建議使用ControlsFX,而不是修復。 ControlsFX具有javafx-ui-sandbox(以及更多)的所有功能,並且構建的目的是它不會與JavaFX系統類發生衝突。這也是一個更積極維護和開發的項目。

如果您不能使用最新版本的ControlsFX所需的最低Java 8版本,那麼以前的版本是ControlsFX 2.x backport,但它不再具有任何相關內容。

龍和不必要的解釋如下

JavaFX的UI的沙箱是一個原型系統,該系統包括碰撞與類包含一些Java分佈類 - 這就是爲什麼你會得到:

Caused by: java.lang.SecurityException: class "javafx.scene.control.Dialogs"'s 
    signer information does not match signer information of other classes 
    in the same package. 

這裏發生的事情是,你在一個jar包中籤了一個javafx-ui-sandbox類(javafx.scene.control.Dialogs)並對它進行簽名(可能你使用的是NetBeans和have the checkbox to self-sign jars switched on,但還有其他方法可以簽名)。因此,您使用不同於Oracle用於簽署JavaFX jar的證書籤署了您的jar。 JavaFX jars包含javafx.scene.control包中的大部分代碼。作爲Java的一些模糊規則的一部分,您不能使用兩個不同的證書在同一個包中籤署代碼,否則會生成安全性異常。

當您在NetBeans中執行時,您可能看不到該問題,因爲您沒有簽署應用程序以在開發環境中執行該應用程序,但是當您構建正在執行的jar文件時,您還正在jar文件,此時jar不起作用。

簡單的修復方法就是將javafx-ui-sandbox源文件複製到項目中,並將軟件包名稱從javafx.scene.control更改爲其他內容(例如com.yourcompany.control)。這樣,類包將不會與爲JavaFX系統提供的默認包衝突,並且您可以簽署代碼(包括com.yourcompany.control.Dialogs類)而不會造成任何問題。但是,再次,您可能更好使用ControlsFX庫。

+0

嗨jewelsea,謝謝你的全面答覆和有用的「長和不必要的解釋」。 ControlsFX 2.x backport是沒有更多的支持?因爲我只看到自述文件:) 所以我認爲使用ControlFX的解決方案 – pask23

+0

哦,是的,似乎是這種情況=>只有Java 8的ControlsFX版本可用現在。 (我更新了我的答案以反映這一點)。 – jewelsea

相關問題