menuBar = new MenuBar();
MenuBar is packaged in javafx.scene.controlという行を含む、大規模な新しいプロジェクトを開始したところです。エラーはありませんが、実行時にこの行に遭遇すると、
スレッド「AppKit Thread」の例外 java.lang.NoClassDefFoundError: クラス javafx.scene.control.MenuBar を初期化できませんでした
Google は、ビルド パスとランタイム パスの間に不一致があることを示唆しています。私が確信していないのは、ビルドパスとランタイムパスが何であるかを実際に伝える方法ですが、私はそれが正しいと思います.
ビルドパス:私はに行きます
Properties -> Java Build Path
そしてそれJRE System Library [Java SE 8 [1.8.0_77]]
がそこにあることを確認してください。さらに、含まれていることを確認しますjfxrt.jar
。また、ビルド時にエラーを検出しないため、それだけで機能していると推測できます。
ランタイム パス:に行きます
Run As -> Run Configurations... -> Classpath
JRE System Library [Java SE 8 [1.8.0_77]]
Bootstrap Entries にリストされていることを確認します。それを展開して、関連するjarが含まれていることを確認できないようです。
実行時のクラスパスに何か不足していますか?
編集:別の症状、またはこれに対するニュアンスを見つけました。menuBar = new MenuBar() は、FX Stage クラスを拡張するオブジェクトのコンストラクターに含まれています。コンストラクターは、ランチャーのボタンをクリックして初期化されます。初めてクリックすると、Exception in thread "AppKit Thread" java.lang.ExceptionInInitializerError
. 2 回目にクリックすると、NoClassDefFoundError が表示されます。これは何か意味がありますか?
EDIT 2:まだこの問題を理解しようとしています。スタイルの問題に絞り込んだ可能性があります。それが何を意味するのかはわかりませんが、トレースが役立つ場合があります。
Caused by: java.lang.NullPointerException
at com.sun.javafx.css.StyleManager.getURL(StyleManager.java:867)
at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1057)
at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:917)
at com.sun.javafx.css.StyleManager._setDefaultUserAgentStylesheet(StyleManager.java:1377)
at com.sun.javafx.css.StyleManager.setUserAgentStylesheets(StyleManager.java:1209)
at com.sun.javafx.application.PlatformImpl.lambda$_setPlatformUserAgentStylesheet$182(PlatformImpl.java:698)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl._setPlatformUserAgentStylesheet(PlatformImpl.java:697)
at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:548)
at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:512)
at javafx.scene.control.Control.<clinit>(Control.java:87)
... 6 more
これらをたどる方法はわかりませんが、JFX MenuBar クラスまで手動でトレースして、MenuBar コンストラクターでそれを見つけることができますgetStyleClass().setAll(DEFAULT_STYLE_CLASS);
。これは .class ファイル自体にあるため、続行する方法がわかりません。うまくいけば、これが役に立ちます。
編集 3:新しいワークスペースを作成し、SVN からプロジェクトをチェックアウトして、最初からやり直すようにというアドバイスがありました。おそらくどういうわけかワークスペースが壊れているのではないかと考えられました。何も変わっていません; まったく同じエラーが表示されました。ここでアイデアが不足しています。
編集 4: (フォーマットをありがとう、イタチ!) ここに私が示すことができるものがあります:
package _______;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import ____.FooMenu;
import ____.FooMenuItem;
import ____.FooUtil;
import ____.FooVBox;
import ____.FooStates;
public class FooStageWithMenu extends FooStage
{
private MenuBar menuBar;
private FooMenu fileMenu;
private FooVBox root;
public FooStageWithMenu(FooStates setting, Image icon)
{
super();
set(setting, icon);
root = new FooVBox();
menuBar = new MenuBar(); //This line is where it fails
root.addNode(menuBar);
/*...*/
}
/*...*/
}
他のいくつかの考え:
- 私は OSX で開発しています。プロジェクトで話した人は全員 Windows を使用しています。この問題の OS 固有の原因はありますか?
- ライブラリの問題の可能性を排除したかったので、JDK 1.8.0_102 を実行している最新バージョンをインストールしましたが、問題は解決しません。
- 最新の JDK でも、
jfxrt.jar
それぞれのライブラリの s の間に不一致がある可能性はありますか? - 特定のエラーの性質 (上記の編集 2 を参照)。URLを取得してスタイルシートにアクセスしようとしているようですが、そのスタイルシートへのアクセスに失敗したり、URLの取得に失敗したりしています。
NullPointerException
それ以上に絞り込むのに役立つものはないようです。私が調べたjfxrt.jar
ところ、JavaFX クラスが検索しているように見えるパスに .css ファイルが存在し、完全で破損していないように見えることがわかりました。
編集 5 : 誰もこれを読んでいないと確信していますが、このバージョンと以前のバージョンの違いに関連する大きな手がかりを見つけました。詳細に入る必要はないと思いますが、この問題はランチャー クラスの 1 行をコメント アウトすることで「修正」されます。2 つのランチャー クラスがあり、一方は他方を拡張します。拡張クラスのコンストラクタはsuper(); new JFXPanel();
2 行目をコメント アウトすると、すぐに明らかな問題は発生せずに動作します。これは、Windows では正常に動作しますが、Mac ではそれを破る行である可能性があります。これが何を意味するのか私にはわかりません。また、私が共有した最初の失敗がこれによって引き起こされた理由もわかりません。しかし、この変更はテスト ブランチで行われただけなので、一時的で限定的な性質を考えると、この問題を適切に修正する必要はないかもしれません。他の人に役立つ場合に備えて、更新を共有したかっただけです。