2010-01-22 18 views
2

Je développe un client autonome qui appelle certaines méthodes EJB sur Glassfish v3. Cela fonctionne bien jusqu'à ce que j'intègre le client dans un plugin Eclipse pour l'exécuter dans notre application RCP. Dans ce contexte, il semble y avoir un problème de classloader lors de l'initialisation du contexte de nommage et j'obtiens l'exception listée ci-dessous. (Le client a gf-client.jar et toutes ses dépendances sur son chemin de classe.)Exécution client autonome Glassfish v3 comme plug-in Eclipse

Il échoue sur

m_ctx = new InitialContext(); 

à l'exception

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) 

Quelqu'un at-il une idée de comment résoudre ce problème?

+0

Je rencontre la même erreur lors de la tentative d'initialiser un conteneur Glassfish intégré dans JUnit (via Ant et NetBeans). –

Répondre

0

Je suppose que vous en utilisant les paramètres de contexte?

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"); 
+1

Oui, les propriétés sont définies correctement. Mon client fonctionne parfaitement lorsqu'il est exécuté en tant qu'application java autonome. Juste dans le contexte du plugin eclipse, le problème du chargeur de classe se produit. – dmt

2

Une enquête plus approfondie du problème a montré que glassfishv3 repose sur une méthode publique findResources(java.lang.String) du 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); 

Mais cette méthode est protégée dans la classe Classloader elle-même. Lors de l'exécution du client en tant qu'application java autonome, le chargeur de classes dérivé sun.misc.Launcher$AppClassLoader est utilisé pour remplacer cette méthode et la déclarer publique. Mais lors de l'exécution comme plugin Eclipse le classloader org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader ne remplace pas le findResource -Méthode qui laisse protégé et inaccessible par la classe ManifestProxy.

Quelle est la meilleure façon de résoudre ce problème? Comment puis-je définir un chargeur de classe spécifique pour un bundle eclipse plugin/osgi?

Merci!