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

Jakarta ee 作为Eclipse插件运行独立的Glassfish v3客户端,jakarta-ee,glassfish,client,glassfish-3,Jakarta Ee,Glassfish,Client,Glassfish 3,我正在开发一个独立的客户端,它在GlassFishV3上调用一些EJB方法。在我将客户机集成到Eclipse插件中以在我们的RCP应用程序中运行之前,这一切都很好。在这个设置中,初始化命名上下文时似乎有一个类加载器问题,下面列出了一个异常。(客户端在其类路径上有gf-client.jar及其所有依赖项。) 它在上失败了 m_ctx = new InitialContext(); 例外 java.lang.NoSuchMethodException: org.eclipse.osgi.inter

我正在开发一个独立的客户端,它在GlassFishV3上调用一些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)
java.lang.NoSuchMethodException:org.eclipse.osgi.internal.baseAdapter.DefaultClassLoader.findResources(java.lang.String)
位于java.lang.Class.getMethod(Class.java:1605)
位于com.sun.enterprise.module.single.ManifestProxy.(ManifestProxy.java:34)
位于com.sun.enterprise.module.single.ProxyModuleDefinition.(ProxyModuleDefinition.java:78)
位于com.sun.enterprise.module.single.ProxyModuleDefinition。(ProxyModuleDefinition.java:73)
位于com.sun.enterprise.module.single.SingleModulesRegistry。(SingleModulesRegistry.java:42)
位于com.sun.enterprise.module.single.SingleModulesRegistry。(SingleModulesRegistry.java:30)
位于com.sun.enterprise.module.single.StaticModulesRegistry。(StaticModulesRegistry.java:60)
位于org.glassfish.internal.api.Globals.getStaticHabitation(Globals.java:67)
位于com.sun.enterprise.naming.impl.SerialContext.(SerialContext.java:183)
位于com.sun.enterprise.naming.impl.SerialContext.(SerialContext.java:253)
位于com.sun.enterprise.naming.impl.SerialInitContextFactory.createInitialContext(SerialInitContextFactory.java:121)
位于com.sun.enterprise.naming.impl.SerialInitContextFactory.getInitialContext(SerialInitContextFactory.java:116)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
位于javax.naming.InitialContext.init(InitialContext.java:223)
位于javax.naming.InitialContext。(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");  

对该问题的进一步调查表明,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);
package com.sun.enterprise.module.single;
[...]
公共类ManifestProxy扩展了Manifest{
[...]    
公共ManifestProxy(ClassLoader cl,列表映射)引发IOException{
试一试{
[...]
Method met=cl.getClass().getMethod(“findResources”,String.class);
枚举URL=null;
试一试{
met.setAccessible(true);
URL=(枚举)met.invoke(cl,JarFile.MANIFEST\u NAME);
但是此方法在Classloader类本身中受到保护。当作为独立java应用程序运行客户端时,将使用派生的Classloader
sun.misc.Launcher$AppClassLoader
,它将覆盖此方法并将其声明为公共。 但是,当作为Eclipse插件运行时,classloader
org.Eclipse.osgi.internal.baseadapter.DefaultClassLoader
不会覆盖
findResource
-方法,该方法使它受到保护,并且不能被ManifestProxy类访问

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


谢谢!

是的,属性设置正确。我的客户端在作为独立java应用程序运行时工作正常。就在eclipse插件上下文中发生了类加载器问题。我在JUnit中尝试初始化嵌入式Glassfish容器(通过Ant和NetBeans)时遇到了相同的错误。