Netbeans 8.2 Designer не может загрузить класс

Я использую Netbeans 8.2 UI Builder/Designer (Matisse) и имею несколько пользовательских виджетов. Пользовательский виджет с именем ChoiceTab отображает объект не-пользовательского интерфейса с именем Choice. Когда я нажимаю на класс с именем HL7RuleAdd, который использует ChoiceTab, и нажимаю "Дизайн", я получаю следующую ошибку:

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$2.run(FormEditor.java:352)
    at org.netbeans.modules.form.FormLAF$2.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.access$300(FormDesignerTC.java:87)
    at org.netbeans.modules.nbform.FormDesignerTC$PreLoadTask$1.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.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.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 и не нашел ничего, кроме вышеуказанной ошибки.

ChoiceTab был добавлен в палитру Netbeans Designer в качестве контейнера, но, похоже, не имеет значения, находится он в палитре или нет.

Я также попробовал очистить и построить все проекты. Он строит без ошибок, но продолжает сбой в Netbeans.

ChoiceTab сам по себе является "разработанным" классом и работает правильно, когда вы нажимаете кнопку "Дизайн".

Кроме того, попытался удалить кэш Netbeans и перезапустить Netbeans. Это также не решило проблему.

У меня закончились идеи, и я был бы признателен за любую помощь.

1 ответ

Решение

С помощью коллеги мне удалось отследить проблему. Короче говоря, класс Choice имеет статические члены, которые инициализируются при загрузке класса. Они в свою очередь вызывали другие статические методы, один из которых был возвращен как синглтон для абстрактной фабрики. Однако синглтон не был установлен, так как конкретная реализация устанавливается при запуске нашего приложения (и до этого недоступна). Таким образом, фабрика вернулась как ноль, что привело к NullPointerException и привело к сбою загрузки класса Choice. Это исключение NullPointerException было затем скрыто вводящим в заблуждение исключением ClassDefNotFoundException.

Мы нашли способ решить проблему путем введения статических операторов System.out.println(...) в статически инициализируемые классы. В сочетании с комментированием некоторого статического кода инициализации мы смогли отследить проблему.

Пример нашего кода System.out.println(...):

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

При запуске Netbeans из командной строки и нажатии кнопки "Дизайн" мы могли видеть наши операторы печати и устранять проблему.

Другие вопросы по тегам