【问题标题】:Running standalone Glassfish v3 client as Eclipse plugin将独立 Glassfish v3 客户端作为 Eclipse 插件运行
【发布时间】:2013-03-14 15:47:35
【问题描述】:

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

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

【问题讨论】:

  • 我在尝试初始化 JUnit 中的嵌入式 Glassfish 容器时遇到了同样的错误(通过 Ant 和 NetBeans)。

标签: jakarta-ee glassfish client glassfish-3


【解决方案1】:

对该问题的进一步调查表明,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 覆盖此方法并将其声明为 public。 但是当作为 Eclipse 插件运行时,类加载器 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader 不会覆盖 findResource-Method,这会使其受到 ManifestProxy 类的保护和无法访问。

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

谢谢!

【讨论】:

    【解决方案2】:

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

        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 插件上下文中,类加载器问题就发生了。
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多