我正在开发一个独立的客户端,它在Glassfish v3上调用一些EJB方法。这很有效,直到我将客户端集成到Eclipse插件中以便在我们的RCP应用程序中运行。在此设置中,似乎在初始化命名上下文时存在类加载器问题,并且我得到下面列出的异常。 (客户端在其类路径上有gf-client.jar及其所有依赖项。)
失败
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 :(得分:2)
对该问题的进一步调查表明,Glassfishv3依赖于findResources(java.lang.String)
的公共方法java.lang.Classloader
。
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
来覆盖此方法并将其声明为public。
但是当作为Eclipse插件运行时,类加载器org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
不会覆盖findResource
- 方法,它使ManifestProxy类保护并且无法访问它。
解决此问题的最佳方法是什么?如何为eclipse插件/ osgi包设置特定的类加载器?
谢谢!
答案 1 :(得分:0)
我假设您使用了正确的上下文设置?
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");