4

後で「dist フォルダー」の .jar を介して JavaFX アプリケーションを実行する際に問題が発生し、NetBeans によってプロジェクトをクリーンアップしてビルドしました。

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解決策ですが、なぜですか??

4

1 に答える 1

1

問題は何ですか

リンク先のjavafx-ui-sandboxプロジェクトは廃止されており、状況によっては後の JavaFX バージョンと互換性がありません。

修正方法

代わりにControlsFXを使用することをお勧めします。ControlsFX には、javafx-ui-sandbox (およびその他) のすべての機能があり、JavaFX システム クラスと競合しないように構築されています。また、より積極的に維持および開発されたプロジェクトでもあります。

ControlsFX の最新バージョンに必要な Java 8 の最小バージョンを使用できない場合、以前はControlsFX 2.x バックポートがありましたが、関連するコンテンツがなくなりました。

長く不必要な説明が続きます

javafx-ui-sandbox は、一部の 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 を使用していて、jar に自己署名するためのチェックボックスがオンになっている可能性があります)。ただし、他の方法で署名することもできます)。そのため、Oracle が JavaFX jar の署名に使用した証明書とは異なる証明書で jar に署名しています。JavaFX jar には、javafx.scene.control パッケージのコードの大部分が含まれています。Java のあいまいな規則の一部として、2 つの異なる証明書を使用して同じパッケージ内のコードに署名することはできません。そうしないと、セキュリティ例外が生成されます。

開発環境内でアプリケーションを実行するためにアプリケーションに署名していないため、NetBeans 内で実行しているときは問題が発生しない可能性がありますが、実行中の jar ファイルをビルドするときは、jar ファイルにも署名しています。その時点で瓶は機能しません。

簡単に修正するには、javafx-ui-sandbox ソースをプロジェクトにコピーし、パッケージ名を javafx.scene.control から別のもの (com.yourcompany.control など) に変更します。こうすることで、クラス パッケージが JavaFX システム用に提供されているデフォルト パッケージと競合せず、コード (com.yourcompany.control.Dialogs クラスを含む) に問題なく署名できます。ただし、代わりに ControlsFX ライブラリを使用する方がよいでしょう。

于 2013-10-01T07:20:05.283 に答える