作为Eclipse插件运行独立的Glassfish v3客户端

作为Eclipse插件运行独立的Glassfish v3客户端

问题描述:

我正在开发一个独立的客户端,它在Glassfish v3上调用一些EJB方法。这很好,直到我将客户端集成到Eclipse插件中运行在我们的RCP应用程序中。在这个设置中,初始化命名上下文似乎有一个类加载器问题,我得到下面列出的例外。 (客户端有GF-client.jar中和它的类路径依赖关系。)作为Eclipse插件运行独立的Glassfish v3客户端

它未能对

m_ctx = new InitialContext(); 

与例外

java.lang.NoSuchMethodException: org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findResources(java.lang.String) 
      at java.lang.Class.getMethod(Class.java:1605) 
      at com.sun.enterprise.module.single.ManifestProxy.<init>(ManifestProxy.java:34) 
      at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:78) 
      at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:73) 
      at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:42) 
      at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:30) 
      at com.sun.enterprise.module.single.StaticModulesRegistry.<init>(StaticModulesRegistry.java:60) 
      at org.glassfish.internal.api.Globals.getStaticHabitat(Globals.java:67) 
      at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:183) 
      at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:253) 
      at com.sun.enterprise.naming.impl.SerialInitContextFactory.createInitialContext(SerialInitContextFactory.java:121) 
      at com.sun.enterprise.naming.impl.SerialInitContextFactory.getInitialContext(SerialInitContextFactory.java:116) 
      at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) 
      at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
      at javax.naming.InitialContext.init(InitialContext.java:223) 
      at javax.naming.InitialContext.<init>(InitialContext.java:175) 

有没有人一个想法如何解决这个问题问题?

+0

尝试在JUnit中初始化嵌入式Glassfish容器(通过Ant和NetBeans)时遇到同样的错误。 – 2010-10-25 11:52:53

我假设你使用正确的上下文设置?

1. Properties props=new Properties(); 
    2. props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory"); 
    3. props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); 
    4. props.setProperty("org.omg.CORBA.ORBInitialPort","3700"); 
+1

是的,属性设置正确。将它作为独立的Java应用程序运行时,我的客户端运行良好。只是在eclipse插件上下文中出现类加载器问题。 – dmt 2010-01-22 14:39:51

问题的进一步研究表明,该Glassfishv3依赖于java.lang.Classloader的公共方法findResources(java.lang.String)

package com.sun.enterprise.module.single; 
[...] 
public class ManifestProxy extends Manifest { 
    [...]  
    public ManifestProxy(ClassLoader cl, List<SeparatorMappings> mappings) throws IOException { 
     try { 
      [...] 
      Method met = cl.getClass().getMethod("findResources", String.class); 
      Enumeration<URL> urls=null; 
      try { 
       met.setAccessible(true); 
       urls = (Enumeration<URL>) met.invoke(cl, JarFile.MANIFEST_NAME); 

但是这种方法在Classloader类本身中受到保护。当客户端作为独立的Java应用程序运行时,使用派生类加载器sun.misc.Launcher$AppClassLoader,它覆盖此方法并将其声明为公共。 但是,当作为Eclipse插件运行时,类加载器org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader不会覆盖findResource -Method,它将使其受ManifestProxy类保护并且无法访问。

解决此问题的最佳方法是什么?如何为eclipse插件/ osgi包设置特定的类加载器?

谢谢!