2010-03-29 6 views
4

우선이 질문은 NetBeans 프로젝트를 개발할 때 NetBeans IDE에서 프로그래밍하는 것과 관련이 없습니다 (예 : NetBeans 플랫폼 프레임 워크 사용).Netbeans 플랫폼 프로젝트 - 종속성이있는 랩된 jar 파일의 문제점

BeanUtils 라이브러리를 사용하여 내 도메인 모델을 검사하고 속성 시트에 표시 할 속성을 제공하려고합니다. 샘플 코드 : 나는 평민 - beanutils-1.8.3.jar 래퍼 모듈을 생성하고, 위의 코드를 포함하는 내 모듈의 모듈에 대한 종속성을 추가 한

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; 
} 

. 모든 것이 잘 컴파일됩니다. 내가 속성 시트보기 (즉 .. 위의 코드가 실제로 실행됩니다), 나는 다음과 같은 오류 얻을 프로그램을 실행하고 열려고하면 :

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 [email protected][org.apache.commons.beanutils] with possible defining loaders [[email protected][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 라이브러리 주위에 래퍼 라이브러리를 만들고 Commons Logging Integration 라이브러리에 종속성을 두었습니다.)

어느 쪽도 문제를 해결하지 못합니다.

다른 랩 라이브러리에서 같은 문제가 발생하는 것으로 나타났습니다. 그들 자신이 외부 의존성을 가지고 있다면 ClassNotFoundExceptions은 내가 필요로하는 라이브러리의 jar를 래핑하고 그것들을 원래의 wrapped 라이브러리 모듈에 의존성으로 추가했다 할지라도 미친 듯이 전파됩니다.

그림으로 내 기지에서

alt text http://files.droplr.com/files/18876491/IwG2.NetBeans%20Project%20problem.png

난 여기에 끝납니다.

Is there a known bug on NB Module dependency

Same issue I'm facing but when wrapping a different jar

NetBeans stance on this - none of the 3 apply to me.

없음 결정적으로 저를 도울 : 인터넷 검색을하는 동안 나는 비슷한 문제를 발견.

닉에게,

EDIT 감사 : 나는 beanutils 라이브러리 래퍼로 평민 로깅과 평민 - 컬렉션에 대한 종속성을 추가하여 컴파일 beanutils와 예제를 얻을 수 있었다. 하지만 내 문제는 다른 경우에도 그대로 남아 있습니다.

답변

2

jar 파일을 다시 작성하고 다시 래핑하여 ClassPathNotFound 예외를 수정했습니다.

0
Caused: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 
    at org.apache.commons.beanutils.PropertyUtilsBean.<init>(PropertyUtilsBean.java:132) 

이 오류는 기본적으로 Commons Logging이 Commons Beanutils와 동일한 클래스 경로에 있어야한다는 것을 암시합니다. 래퍼 모듈을 만드는 것이 무엇을 의미하는지, 왜 그렇게하고 싶은지 잘 모르겠습니다 만, 일반적으로 프로젝트의 buildpath (일명 classpath)가 포함 된 프로젝트 폴더에 라이브러리 (JAR 파일)를 놓기 만하면됩니다. JAR 파일을 수동으로 프로젝트의 빌드 경로에 추가하십시오.

+1

Netbeans 플랫폼에서는 원시 jar를 포함하지 않습니다. jar를 래핑하는 Module을 생성해야합니다. – I82Much