2

我正在开发一个在 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)

有人知道如何解决这个问题吗?

4

2 回答 2

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-Method,这会使其受到 ManifestProxy 类的保护和无法访问。

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

谢谢!

于 2010-01-25T14:00:03.270 回答
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");  
于 2010-01-22T14:18:58.593 回答