4

手始めに、この質問は、NetBeansプロジェクトの開発(たとえば、NetBeansプラットフォームフレームワークの使用)ほど、NetBeansIDEでのプログラミングに関するものではありません。

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-loggingコンポーネントを使用していることを理解しています。commons-loggingコンポーネントを2つの異なる方法で追加しようとしました(commons-loggingライブラリの周りにラッパーライブラリを作成することと、Commons Logging Integrationライブラリに依存関係を置くこと)。

どちらも問題を解決しません。

同じ問題が他のラップされたライブラリでも発生することに気づきました。それら自体に外部依存関係がある場合、ClassNotFoundExceptionsは、必要なライブラリのjarをラップして、元のラップされたライブラリモジュールに依存関係として追加した場合でも、狂ったように伝播します。

絵画的に:

代替テキストhttp://files.droplr.com/files/18876491/IwG2.NetBeans%20Project%20problem.png

私はここで私の知恵の終わりにいます。グーグル中に同様の問題に気づきました:

NBモジュールの依存関係に既知のバグはありますか

私が直面しているのと同じ問題ですが、別の瓶を包むとき

これに対するNetBeansのスタンス-3つのうちどれも私には当てはまりません。

決定的に私を助けるものはありません。

ありがとうございました、

ニック

編集:commons-loggingとcommons-collectionsへの依存関係をbeanutilsライブラリラッパーに追加することで、beanutilsを使用した例をコンパイルすることができました。しかし、私の問題は他の例でも残っています。

4

2 に答える 2

2

私はjarファイルを再構築し、それらを再ラップしました。これにより、ClassPathNotFoundの例外が修正されました。

于 2010-03-31T22:03:00.887 に答える
0
Caused: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at org.apache.commons.beanutils.PropertyUtilsBean.<init>(PropertyUtilsBean.java:132)

このエラーは基本的に、CommonsLoggingがCommonsBeanutilsと同じクラスパスにある必要があることを示唆しています。ラッパーモジュールを作成することの意味と、それを実行する理由はわかりませんが、通常は、プロジェクトのビルドパス(別名クラスパス)でカバーされるプロジェクトフォルダーにライブラリ(JARファイル)をドロップするだけです。 JARファイルをプロジェクトのビルドパスに手動で追加します。

于 2010-03-29T18:13:58.090 に答える