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

时间:2010-01-22 14:11:49

标签: java-ee glassfish client glassfish-3

我正在开发一个独立的客户端,它在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)

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

2 个答案:

答案 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");