2012-01-12 48 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

我的猜測是錯誤是由類加載器在webstart應用程序中不同於標準Java應用程序造成的。我可以建議發佈一個代碼片段,您可以在其中創建/獲取Javassist ClassPool和錯誤的堆棧跟蹤(這可能會提示在類查找失敗時使用哪個類加載器)。 – prunge 2012-01-12 23:19:06

回答

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

非常感謝!我一直在尋找這個解決方案! – 2013-06-11 15:13:33