作为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)
有没有人一个想法如何解决这个问题问题?
我假设你使用正确的上下文设置?
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");
是的,属性设置正确。将它作为独立的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包设置特定的类加载器?
谢谢!
尝试在JUnit中初始化嵌入式Glassfish容器(通过Ant和NetBeans)时遇到同样的错误。 – 2010-10-25 11:52:53