Como configurar o JNDI para o Glassfish 3.1.2 para um cliente independente?

Eu tento conectar de um cliente de swing independente (executando em uma JVM separada na máquina cliente) para o servidor Glassfish.

Atualmente, uso as seguintes configurações do NetBeans e tudo funciona bem:

System.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); System.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); System.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.3"); System.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); InitialContext context = new InitialContext(); 

Mas quando tento iniciar o cliente compilado a partir do console, digitando “java -jar client.jar”, recebo o seguinte erro:

 D:\workspace\gf-client\dist>java -jar gf-client.jar 17.08.2012 11:07:38 ch.client.core.ServerContext getInitialContext SCHWERWIEGEND: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory] at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.init(Unknown Source) at javax.naming.InitialContext.(Unknown Source) at ch.lawsuite.core.ServerContext.getInitialContext(ServerContext.java:2 7) at ch.client.core.remote.Facades.initialize(Facades.java:68) at ch.client.core.Client.main(Client.java:57) Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialIni tContextFactory at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source) ... 7 more Exception in thread "main" java.lang.NullPointerException at ch.client.core.remote.Facades.initialize(Facades.java:69) at ch.client.core.Client.main(Client.java:57) 

Alguém tem alguma ideia útil?

  • A JVM perde alguma libs? Quais? (funciona a partir do netbeans e todas as bibliotecas dependentes são empacotadas no arquivo jar compilado (pelo menos eu acho que sim ..))
  • Existem fábricas alternativas de contextos seriais para a Glassfish?

Muito obrigado pela sua ajuda antecipadamente!

Um ponto para limpar as interfaces EJB remotas

Você deseja uma interface EJB remota quando seu aplicativo cliente estiver em uma JVM diferente daquela que hospeda o módulo EJB. Em outras palavras:

  • O aplicativo cliente reside em uma JVM e o módulo EJB é implementado em outra JVM na mesma máquina

OU

  • O aplicativo cliente reside em uma JVM e o módulo EJB é implementado em outra JVM em uma máquina remota.

Por uma questão de simplicidade

Vamos considerar o primeiro cenário em que o aplicativo cliente e o módulo EJB residem em diferentes JVMs na mesma máquina.

  1. Certifique-se de ter 2 JDKs instalados em sua máquina.
  2. Implemente o módulo EJB em uma instalação do Glassfish apontando para um JDK (JVM). Podemos concordar em instalar o Glassfish em “C: / glassfish3 /”
  3. Segundo a documantação neste link . Adicione ao seu caminho de class do aplicativo cliente o arquivo “gf-client.jar” como uma biblioteca externa dentro do diretório de instalação (isto é, C: /glassfish3/glassfish/lib/gf-client.jar) ao invés de copiá-lo.
  4. Além disso, inclua no seu caminho de class do aplicativo cliente o arquivo remote_interface.jar inclui a interface de negócios Remota do seu EJB.
  5. Execute o aplicativo cliente SE (independente) no segundo JDK (JVM)

Uma dica importante sobre o cliente

Conforme a documentação, os clientes java independentes devem usar explicitamente o nome JNDI global para procurar o EJB remoto. Além disso, Glassfish não precisa de nenhuma instialização de propriedades para invocar o construtor InitialContext (). Assim, o aplicativo cliente pode chamar o EJB usando o seguinte snippet:

 InitialContext context = new InitialContext(); _RemoteEjbInterface ejbBean = (_RemoteEjbInterface) context.lookup("java:global/DeployedEJBAppName/EjbImplClass!com.sam._RemoteEjbInterface"); 

No caso de sua aplicação cliente stand alone ser um especialista, então você precisa

  1. Conta para o passo acima (3) adicionando esta input ao seu aplicativo cliente POM:

      org.glassfish.main.appclient.client gf-client 3.1.2 system C:/glassfish3/glassfish/lib/gf-client.jar  
  2. Conta para a etapa acima (4) por uma dependência de POM apontando para você remote_interface.jar em seu repository local, assumindo que você o instalou. Siga isto para saber como.

Outra documentação para referência é aqui

Examinando o arquivo MANIFEST.MF da biblioteca gf-client.jar notei que existem algumas outras dezenas de jar-libs referenciadas a partir dele. Para executar o cliente fora da plataforma netbeans, tive que copiar todas essas bibliotecas para a compilation final do meu próprio aplicativo. Então funciona muito bem … 🙂

Você está perdendo o jar contendo a class com.sun.enterprise.naming.SerialInitialContextFactory no seu classpath. Adicione-o ao manifesto do jar do seu cliente.

Intereting Posts