Для начала этот вопрос касается не столько программирования в IDE NetBeans, сколько разработки проекта NetBeans (например, с использованием платформы NetBeans).
Я пытаюсь использовать библиотеку BeanUtils для анализа моделей моего домена и предоставления свойств для отображения в листе свойств. Пример кода:
public class MyNode extends AbstractNode implements PropertyChangeListener {
private static final PropertyUtilsBean bean = new PropertyUtilsBean();
// snip
protected Sheet createSheet() {
Sheet sheet = Sheet.createDefault();
Sheet.Set set = Sheet.createPropertiesSet();
APIObject obj = getLookup().lookup (APIObject.class);
PropertyDescriptor[] descriptors = bean.getPropertyDescriptors(obj);
for (PropertyDescriptor d : descriptors) {
Method readMethod = d.getReadMethod();
Method writeMethod = d.getWriteMethod();
Class valueType = d.getClass();
Property p = new PropertySupport.Reflection(obj, valueType, readMethod, writeMethod);
set.put(p);
}
sheet.put(set);
return sheet;
}
Я создал модуль-оболочку для commons-beanutils-1.8.3.jar и добавил зависимость от модуля в мой модуль, содержащий приведенный выше код. Все компилируется нормально. Когда я пытаюсь запустить программу и открыть представление листа свойств (т.е. приведенный выше код фактически запускается), я получаю следующую ошибку:
java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
at org.netbeans.ProxyClassLoader.loadClass(ProxyClassLoader.java:259)
Caused: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory starting from ModuleCL@64e48e45[org.apache.commons.beanutils] with possible defining loaders [ModuleCL@75da931b[org.netbeans.libs.commons_logging]] and declared parents []
at org.netbeans.ProxyClassLoader.loadClass(ProxyClassLoader.java:261)
at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399)
Caused: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.commons.beanutils.PropertyUtilsBean.<init>(PropertyUtilsBean.java:132)
at org.myorg.myeditor.MyNode.<clinit>(MyNode.java:35)
at org.myorg.myeditor.MyEditor.<init>(MyEditor.java:33)
at org.myorg.myeditor.OpenEditorAction.actionPerformed(OpenEditorAction.java:13)
at org.openide.awt.AlwaysEnabledAction$1.run(AlwaysEnabledAction.java:139)
at org.netbeans.modules.openide.util.ActionsBridge.implPerformAction(ActionsBridge.java:83)
at org.netbeans.modules.openide.util.ActionsBridge.doPerformAction(ActionsBridge.java:67)
at org.openide.awt.AlwaysEnabledAction.actionPerformed(AlwaysEnabledAction.java:142)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:389)
at com.apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:95)
at java.awt.MenuItem.processActionEvent(MenuItem.java:627)
at java.awt.MenuItem.processEvent(MenuItem.java:586)
at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:317)
at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:305)
[catch] at java.awt.EventQueue.dispatchEvent(EventQueue.java:638)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:125)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Я понимаю, что beanutils использует компонент регистрации общего доступа. Я попытался добавить компонент регистрации общих файлов двумя различными способами (создать библиотеку-оболочку вокруг библиотеки регистрации общих ресурсов и установить зависимость от библиотеки интеграции ведения журнала Commons).
Ни одна из них не решает проблему.
Я заметил, что та же проблема возникает с другими упакованными библиотеками; если у них самих есть внешние зависимости, ClassNotFoundExceptions распространяются как сумасшедшие, даже если я обернул банки нужных им библиотек и добавил их в качестве зависимостей в исходный обернутый библиотечный модуль.
Наглядно:
альтернативный текст http://files.droplr.com/files/18876491/IwG2.NetBeans%20Project%20problem.png
Я в своем уме. Я заметил похожие проблемы во время поиска в Google:
Есть ли известная ошибка в зависимости от модуля NB
Та же проблема, с которой я сталкиваюсь, но при упаковке другой банки
Позиция NetBeans по этому вопросу - ни один из 3 не относится ко мне.
Никто не поможет мне окончательно.
Спасибо,
Ник
РЕДАКТИРОВАТЬ: мне удалось получить пример с beanutils для компиляции, добавив зависимости к commons-logging и commons-collection в оболочку библиотеки beanutils. Но моя проблема остается в других случаях.