我刚开始一个大的新项目,包含行menuBar = new MenuBar();
MenuBar打包在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条目中。我似乎无法扩展它并确认它包含相关的jar。
我是否遗漏了运行时类路径中的任何内容?
编辑:我发现了另一个症状或细微差别。 menuBar = new MenuBar()包含在扩展FX Stage类的对象的构造函数中。单击启动器上的按钮初始化构造函数。当我第一次点击它时,我得到一个Exception in thread "AppKit Thread" java.lang.ExceptionInInitializerError
。我第二次点击它是NoClassDefFoundError出现的时候。这有什么意义吗?
编辑2:仍在尝试解决此问题。我可能将它缩小到Style的一个问题。我不知道这意味着什么,但是跟踪可能有所帮助:
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
我不知道如何跟进那些......还有6个,但我可以手动追踪到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);
/*...*/
}
/*...*/
}
其他一些想法:
jfxrt.jar
之间是否存在一些差异? NullPointerException
的任何内容似乎都没有帮助我缩小范围。我确实探索了我的jfxrt.jar
并发现在JavaFX类似乎正在搜索的路径中,.css文件确实存在并且看起来完整且没有损坏。 编辑5 :所以我很确定没人在读这个,但我做了只是找到一个很大的线索,与这个版本和之前版本之间的差异有关。我认为我不需要了解具体细节,但是通过在启动器类中注释掉一行来“解决”这个问题。我们有两个启动器类,其中一个扩展另一个。扩展类的构造函数只是super(); new JFXPanel();
如果我注释掉第二行,它的工作没有任何明显的问题。这可能是在Mac上破坏它的行,而它在Windows中运行良好。我不知道这意味着什么,我不知道为什么我分享的原始故障是由此引起的。但是这个改变只是在一个测试分支中进行的,所以考虑到临时和有限的性质,我们可能没有必要给这个问题一个正确的解决方案。我只是想分享这个更新,以防它帮助其他任何人。