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?
Muito obrigado pela sua ajuda antecipadamente!
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:
OU
Vamos considerar o primeiro cenário em que o aplicativo cliente e o módulo EJB residem em diferentes JVMs na mesma máquina.
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");
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
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.