Eclipse JavaFX菜单栏的NoClassDefError

Eclipse JavaFX菜单栏的NoClassDefError,eclipse,macos,javafx,classpath,eclipse-classpath,Eclipse,Macos,Javafx,Classpath,Eclipse Classpath,我刚刚开始一个新的大型项目,其中包含一行menuBar=newmenubar()菜单栏打包在javafx.scene.control中。没有错误,但当它在运行时遇到这一行时,我得到 线程“AppKit thread”java.lang.NoClassDefFoundError中出现异常:无法初始化类javafx.scene.control.MenuBar 谷歌建议我的构建路径和运行时路径之间存在差异。我不确定的是,如何真正知道构建路径和运行时路径是什么,尽管我认为我是对的 构建路径:我转到 Pr

我刚刚开始一个新的大型项目,其中包含一行
menuBar=newmenubar()菜单栏打包在javafx.scene.control中。没有错误,但当它在运行时遇到这一行时,我得到

线程“AppKit thread”java.lang.NoClassDefFoundError中出现异常:无法初始化类javafx.scene.control.MenuBar

谷歌建议我的构建路径和运行时路径之间存在差异。我不确定的是,如何真正知道构建路径和运行时路径是什么,尽管我认为我是对的

构建路径:我转到

Properties -> Java Build Path 
您可以看到
JRE系统库[javase8[1.8.0\u77]]
就在那里。我进一步确认它包含
jfxrt.jar
。它在构建时也没有检测到错误,所以我可以假设它正是因为这个原因才工作的

运行时路径:我转到

Run As -> Run Configurations... -> Classpath 
可以看到
JRE系统库[javase8[1.8.0\u77]]
列在引导条目中。我似乎无法扩展它并确认它包含相关的jar

运行时类路径中是否缺少任何内容

编辑:我发现了另一个症状,或是其中的细微差别。menuBar=new menuBar()包含在扩展FX Stage类的对象的构造函数中。通过单击启动器上的按钮初始化构造函数。当我第一次单击它时,我在线程“AppKit thread”java.lang.ExceptionInInitializeError中得到一个
异常。我第二次单击它时,NoClassDefFoundError出现。这有什么意义吗

编辑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
其他一些想法:

  • 我在OSX上开发,我在项目中与之交谈的每个人都在使用Windows。这个问题可能是由操作系统引起的吗
  • 我们希望消除库问题的可能性,所以我安装了最新版本,现在运行JDK1.8.0_102,问题仍然存在
  • 即使在最新的JDK中,我们各自的库中的
    jfxrt.jar
    s之间是否存在一些差异
  • 特定错误的性质(请参见上面的编辑2)。似乎有人试图通过检索URL来访问样式表,但它要么无法访问该样式表,要么无法获取URL,等等。关于
    NullPointerException
    的任何内容似乎都不能帮助我缩小范围。我确实研究了我的
    jfxrt.jar
    ,发现在JavaFX类似乎要搜索的路径中,.css文件确实存在,而且似乎完整且未损坏

编辑5:所以我很确定没有人读过这篇文章,但我确实找到了一条大线索,与此版本和以前版本之间的差异有关。我不认为我需要进入细节,但是这个问题通过在launcher类中注释掉一行来“修复”。我们有两个启动器类,其中一个扩展了另一个。扩展类的构造函数就是
super();新JFXPanel()如果我注释掉第二行,它不会立即出现任何明显的问题。这可能是在Mac上打破它的一条线,而它在Windows中工作正常。我不知道这意味着什么,我也不知道为什么我分享的最初失败是由这一点造成的。但是这个改变只是在一个测试分支中进行的,所以考虑到这个问题的临时性和有限性,我们可能没有必要对它进行适当的修复。我只是想分享一下更新,以防它对其他人有所帮助。

您是使用Oracle JDK还是OpenJDK?看起来像Oracle:
******$java-version java version“1.8.0_77”java(TM)SE运行时环境(build 1.8.0_77-b03)java HotSpot(TM)64位服务器虚拟机(build 25.77-b03,混合模式)
你能在菜单栏初始化的地方添加包括导入在内的代码吗?这取决于很多专有类,所以我不确定我能显示什么。我看看能不能给你一个匿名的片段。根据一位同事的直觉,我还有一些意见,包括对风格问题的阐述,这似乎是核心问题。类似的问题是在macOS 10.13.3上使用JFreeChart fx 1.0.1和scalafx 8。由于PrismFontLoader中的类加载器为空,在对象中运行main方法会导致“AppKit线程”中出现NPE。(通过ChartViewer和ChartCanvas进行了调用。)从扩展JFXApp的对象启动时,问题消失了。您使用的是Oracle JDK还是OpenJDK?看起来像Oracle:
********$java-version java version“1.8.0_77”java(TM)SE运行时环境(build 1.8.0_77-b03)java HotSpot(TM)64位服务器虚拟机(build 25.77-b03,混合模式)
你能在菜单栏初始化的地方添加包括导入在内的代码吗?这取决于很多专有类,所以我不确定我能显示什么。我看看能不能给你一个匿名的片段。根据一位同事的直觉,我还有一些意见,包括对风格问题的阐述,这似乎是核心问题。类似的问题是在macOS 10.13.3上使用JFreeChart fx 1.0.1和scalafx 8。由于PrismFontLoader中的类加载器为空,在对象中运行main方法会导致“AppKit线程”中出现NPE。(调用通过ChartViewer和ChartCanvas进行。)从扩展JFXApp的对象启动时,问题消失了。
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);
        /*...*/
    }
    /*...*/
}