2012-01-12 3 views
1

이 문제는 해결 된 오래된 문제인 것처럼 보이지만 불행히도 좋은 참고 자료를 찾을 수 없습니다. Javaassist를 사용하는 Java 응용 프로그램이 있습니다. Webstart 응용 프로그램으로 업그레이드 할 때까지 제대로 작동했습니다. 이제 Javaassist에서 classNotFoundException을 제공합니다. 클래스는 확실히 클래스 경로에 있습니다.Javaassist 및 Webstart

나는이 게시물을 찾았습니다. https://community.jboss.org/message/302408 이것은 오래되어서 디코딩 할 수 없습니다. 누군가 나 한테 손을 내밀어 줄 수 있니?

ctClasses = new HashMap<String, CtClass>(); 
    classPool = ClassPool.getDefault(); 

    try { 
     ctEntity = classPool.get("org.myclass"); 
    } catch (NotFoundException e) { 
     logger.error("Could not find entity class, this should not happen"); 
     throw new RuntimeException("Could not find Entity class",e); 
    } 

스택 트레이스에 아무것도 없다 :

감사

다음은 코드입니다.

java.lang.RuntimeException: Could not find Entity class 
    at ca.cbc.panacea.metadata.JavassistClassGeneratorImpl.<init>(JavassistClassGeneratorImpl.java:32) 
    at ca.cbc.panacea.metadata.ClassGeneratorFactory.getDefaultClassGenerator(ClassGeneratorFactory.java:12) 
    at ca.cbc.panacea.metadata.ClassCreator.<init>(ClassCreator.java:30) 
    at ca.cbc.panacea.Panacea.digestMappingFile(Panacea.java:75) 
    at ca.cbc.panacea.console.PanaceaConsole.validateMappingFile(PanaceaConsole.java:46) 
    at ca.cbc.panacea.console.PanaceaConsoleUI.actionPerformed(PanaceaConsoleUI.java:132) 
    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.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.Component.processMouseEvent(Component.java:6373) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
    at java.awt.Component.processEvent(Component.java:6138) 
    at java.awt.Container.processEvent(Container.java:2085) 
    at java.awt.Component.dispatchEventImpl(Component.java:4735) 
    at java.awt.Container.dispatchEventImpl(Container.java:2143) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212) 
    at java.awt.Container.dispatchEventImpl(Container.java:2129) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4565) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679) 
    at java.awt.EventQueue.access$000(EventQueue.java:85) 
    at java.awt.EventQueue$1.run(EventQueue.java:638) 
    at java.awt.EventQueue$1.run(EventQueue.java:636) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:652) 
    at java.awt.EventQueue$2.run(EventQueue.java:650) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:649) 
    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) 
    Caused by: javassist.NotFoundException: ca.cbc.panacea.metadata.Entity 
    at javassist.ClassPool.get(ClassPool.java:436) 
    at ca.cbc.panacea.metadata.JavassistClassGeneratorImpl.<init>  (JavassistClassGeneratorImpl.java:29) 

문제는 실제로 ClassLoader입니다. JNLP는 java 커맨드 라인과 다른 클래스 로더를 사용합니다. 문제는 JNLP 클래스 로더와 Javassist를 조정하는 방법입니다.

+1

내 생각에이 오류는 표준 Java 응용 프로그램과 달리 webstart 응용 프로그램에서 클래스 로더가 다른 것으로 인해 발생합니다. Javassist ClassPool을 만들고/가져 오는 코드 스 니펫을 게시하는 것이 좋습니다 (클래스 조회가 실패 할 때 어떤 클래스 로더가 사용되고 있는지에 대한 힌트를 줄 수 있음). – prunge

답변

3

키는 응용 프로그램 클래스의 클래스 로더를보기 위해 ClassPool을 설정합니다. 이것은 ClassPool에 클래스 경로를 추가하여 수행 할 수 있습니다

당신은 웹 스타트 응용 프로그램과 시스템 클래스 로더로부터 클래스를로드하지 않는 응용 프로그램의 클래스 풀의 클래스 경로를 정의 할 필요가
ctClasses = new HashMap<String, CtClass>(); 
classPool = ClassPool.getDefault(); 

//Add the classloader of your application's classes so Javassist can find them 
ClassLoader loader = org.MyClass.class.getClassLoader(); 
pool.appendClassPath(new LoaderClassPath(loader)); 

try { 
    ctEntity = classPool.get("org.MyClass"); 
} catch (NotFoundException e) { 
    logger.error("Could not find entity class, this should not happen"); 
    throw new RuntimeException("Could not find Entity class",e); 
} 

, Eclipse 플러그인 및 Java EE 컨테이너에서 실행되는 애플리케이션.

자세한 내용은 클래스 검색 경로 섹션의 Javassist tutorial 섹션을 참조하십시오.

+0

정말 고마워요! 나는이 해결책을 위해 온통 찾고 있었다! –