SerialInitContextFactory não encontrado na nomenclatura glassfish

Este começa a me enlouquecer completamente …

Eu quero criar um aplicativo cliente Glassfish usando Maven.

Para isso, adicionei a dependência do gf-client requerida:

 org.glassfish.appclient gf-client 3.1 pom compile  

Então, querendo entrar em contato com meu servidor Glassfish, rodando no mesmo aplicativo, eu faço a consulta usual:

 Properties p = new Properties(); // optional. Defaults to localhost. Only needed if web server is running // on a different host than the appserver p.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); // optional. Defaults to 3700. Only needed if target orb port is not // 3700. p.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); Context context = new InitialContext(p); // Stores the list of reachable EJBs return context.lookup(interfacesToNames.getProperty(className)); 

Infelizmente, ao fazer isso, tudo que eu obtenho é

 Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.impl.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com/sun/enterprise/naming/impl/SerialInitContextFactory] at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) at javax.naming.InitialContext.init(InitialContext.java:242) at javax.naming.InitialContext.(InitialContext.java:216) ... 6 more Caused by: java.lang.ClassNotFoundException: com/sun/enterprise/naming/impl/SerialInitContextFactory at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:63) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671) ... 9 more 

Após algumas verificações, notei que o meu glassfish-naming-3.1.jar está presente no CLASSPATH para esse aplicativo cliente. E, de acordo com a pesquisa de código do Eclipse, é esse jar que deve conter com.sun.enterprise.naming.impl.SerialInitContextFactory . No entanto, se no modo de debugging, eu getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl/SerialInitContextFactory") me retorna null, o que indica claramente que a class não pode ser encontrada.

Para mais informações, o JAR é copiado do meu repository maven local usando esta configuração de plugin:

   maven-dependency-plugin   package output directory package  copy-dependencies   true compile ${dependencies.outputDir}/jars ${dependencies.outputDir}     

Além disso, tenho que confessar que, ao executar um teste simples usando a mesma API para conectar ao servidor Glassfish, não há absolutamente nenhum problema, o que me direciona para um problema do ClassLoader.

Ao executar esse cliente, o carregador de classs atual é (conforme indicado por getClass().getClassLoader().getClass().getName() sun.misc.Launcher$AppClassLoader getClass().getClassLoader().getClass().getName() ) sun.misc.Launcher$AppClassLoader . Que infelizmente é exatamente o mesmo que ao executar o teste de unidade.

Então, o que posso fazer para resolver esse bug?

EDIT Class existe em glassfish-naming-3.1.jar , mas não parece ser encontrado pelo classloader padrão.

EDIT Uma descoberta interessante:

 getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl") = jar:file:/C:/Users/pouet/pouet/target/jars/glassfish-naming-3.1.jar!/com/sun/enterprise/naming/impl 

enquanto

 getClass().getClassLoader().getResource("com/sun/enterprise/naming/impl/SerialInitContextFactory") = null 

Por uma razão que eu não entendo totalmente, há um carregador de classs de Contexto configurado quando executado no aplicativo. Este classloader parece usar algum tipo de restrição de nomenclatura OSGi.

Como conseqüência, para evitar o bug, eu redefino o carregador de classs de contexto:

 Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 

E funcionou!

Você já tentou usar o ACC? Sua solução parece artificial.