如何为独立客户端设置Glassfish 3.1.2的JNDI?

我尝试从独立的swing客户端(在客户端计算机上的单独JVM中运行)连接到Glassfish服务器。

我目前使用Netbeans的以下设置,一切正常:

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(); 

但是当我尝试通过键入“java -jar client.jar”从控制台启动编译的客户端时,我收到以下错误:

 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) 

有人有什么有用的想法吗?

  • JVM是否错过了任何库? 哪个? (它适用于netbeans,并且所有依赖的lib都打包到已编译的jar文件中(至少我认为是这样..))
  • Glassfish还有替代串行上下文工厂吗?

非常感谢您的帮助!

要明确远程EJB接口

当客户端应用程序位于与托管EJB模块的JVM不同的JVM上时,您需要远程EJB接口。 换一种说法:

  • 客户端应用程序位于一个JVM上,EJB模块部署在同一台计算机上的另一个JVM上

要么

  • 客户端应用程序位于一个JVM上,EJB模块部署在远程计算机上的另一个JVM上。

为简单起见

让我们考虑第一种情况,即客户端应用程序和EJB模块都位于同一台计算机上的不同JVM上。

  1. 确保您的计算机上安装了2个JDK。
  2. 在指向一个JDK(JVM)的Glassfish安装中部署EJB模块。 我们可以同意在“C:/ glassfish3 /”中安装Glassfish
  3. 根据此链接中的文档。 从安装目录(即C:/glassfish3/glassfish/lib/gf-client.jar)中将文件“gf-client.jar”作为外部库添加到客户端应用程序类路径中,而不是复制它。
  4. 还要添加到客户端应用程序类路径中,文件remote_interface.jar包含EJB的远程业务接口。
  5. 在第二个JDK(JVM)上运行SE(独立)客户端应用程序

关于客户的一个重要提示

根据文档,独立的Java客户端必须显式使用全局JNDI名称来查找远程EJB。 此外,Glassfish不需要任何属性instialization来调用InitialContext()构造函数。 因此,客户端应用程序可以使用以下代码段调用EJB:

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

如果您的SE独立客户端应用程序是maven,那么您需要

  1. 通过将此条目添加到客户端应用程序POM来考虑上述步骤(3):

      org.glassfish.main.appclient.client gf-client 3.1.2 system C:/glassfish3/glassfish/lib/gf-client.jar  
  2. 假设您安装了本地maven仓库中的POM依赖关系指向您的remote_interface.jar,请考虑上述步骤(4)。 按照这个来了解如何。

另一个参考文档在这里

通过查看gf-client.jar库的MANIFEST.MF文件,我注意到那里引用了其他几十个jar-libs。 为了在netbeans平台之外运行客户端,我不得不将所有这些库复制到我自己的应用程序的最终版本中。 然后它工作得很好…… 🙂

您在类路径中缺少包含类com.sun.enterprise.naming.SerialInitialContextFactory的jar。 将其添加到客户端jar的清单中。