Netbeans 8.2 设计器无法加载 class

Netbeans 8.2 Designer fails to load class

我正在使用 Netbeans 8.2 UI Builder/Designer (Matisse) 并且有一些自定义小部件。一个名为 ChoiceTab 的自定义小部件显示一个名为 Choice 的非 UI 对象。当我单击名为 HL7RuleAdd 并使用 ChoiceTab 的 class 并单击 "Design" 时,出现以下错误:

ClassDefNotFoundException:

java.lang.NoClassDefFoundError: Could not initialize class com.hcs.orc.datatype.Choice
    at com.hcs.orc.detail.ChoiceTab.<init>(ChoiceTab.java:58)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:180)
    at org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:252)
    at org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:191)
    at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:780)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
    at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:824)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
    at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:824)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:503)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:283)
    at org.netbeans.modules.form.FormEditor.run(FormEditor.java:352)
    at org.netbeans.modules.form.FormLAF.run(FormLAF.java:293)
    at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEventAccess(NbMutexEventProvider.java:138)
    at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:98)
    at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:94)
    at org.openide.util.Mutex.readAccess(Mutex.java:250)
    at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
    at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:349)
    at org.netbeans.modules.nbform.FormEditorSupport.loadOpeningForm(FormEditorSupport.java:461)
    at org.netbeans.modules.nbform.FormDesignerTC.loadForm(FormDesignerTC.java:279)
    at org.netbeans.modules.nbform.FormDesignerTC.access0(FormDesignerTC.java:87)
    at org.netbeans.modules.nbform.FormDesignerTC$PreLoadTask.run(FormDesignerTC.java:268)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access0(EventQueue.java:97)
    at java.awt.EventQueue.run(EventQueue.java:709)
    at java.awt.EventQueue.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

ChoiceTab在三个不同的地方使用,都存在这个问题,而且都属于同一个项目

这很奇怪,因为 com.hcs.orc.datatype.Choice 与上面的 ChoiceTab 和 HL7RuleAdd 在同一个项目中。更奇怪的是,Netbeans 在我的代码的一个分支中工作正常,但在另一个分支中失败并出现上述错误。

这是第 58 行和 ChoiceTab 构造函数的开始:

public ChoiceTab() {
    initComponents();

    DataFieldTraits trait = Choice.getFieldTraits(ORCConstants.DI_CHOICE_MNC, Choice.dinfo.getTraitsS());

正如您在第 58 行看到的那样,对 Choice 的引用是静态调用以获取有关 Choice 的其他信息。

这两个分支差别不大(最近的分支),所以我撤消了失败分支中的大部分更改,但并没有解决问题。我查看了 IDE 日志 window,但没有发现除上述错误之外的任何内容。

ChoiceTab 已作为容器添加到 Netbeans Designer Palette,但它是否在 Palette 中似乎没有什么区别。

我也尝试过清理并构建所有项目。它构建没有错误,但在 Netbeans 中继续失败。

ChoiceTab 本身是一个 "designed" class,当您单击 "Design" 按钮时可以正常工作。

此外,尝试删除 Netbeans 缓存并重新启动 Netbeans。这也没有解决问题。

我 运行 没有想法,如果有任何帮助,我将不胜感激。

在同事的帮助下,我找到了问题所在。总之,Choice class 具有在 class 加载时初始化的静态成员。这些依次调用其他静态方法,其中一个返回抽象工厂的单例。但是,未设置单例,因为具体实现是在我们的应用程序启动时设置的(并且在此之前不可用)。因此工厂返回为 null,这导致 NullPointerException 并导致 Choice class 加载失败。然后这个 NullPointerException 被误导性的 ClassDefNotFoundException 掩盖了。

我们追踪问题的方法是将静态 System.out.println(...) 语句引入不同的 classes 进行静态初始化。结合注释掉一些静态初始化代码,我们能够找到问题所在。

我们的 System.out.println(...) 代码示例:

static {
      System.out.println("Initializing Choice";
}

当 运行 Netbeans 从命令行单击 "Design" 按钮时,我们可以看到我们的打印语句并调试问题。