2013-09-30 51 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

相关问题