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

时间:2012-08-17 09:11:28

标签: java glassfish java-ee-6 initial-context

我尝试从独立的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.<init>(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是否遗漏了任何libs?哪个? (它适用于netbeans,并且所有依赖的lib都打包到已编译的jar文件中(至少我认为是这样..))
  • Glassfish还有替代串行上下文工厂吗?

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

要明确远程EJB接口

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

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

OR

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

为简单起见

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

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

    根据文档,独立的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):

      <dependency>
          <groupId>org.glassfish.main.appclient.client</groupId>
          <artifactId>gf-client</artifactId>
          <version>3.1.2</version>
          <scope>system</scope>
          <systemPath>C:/glassfish3/glassfish/lib/gf-client.jar</systemPath>
      </dependency>
      
    2. 假设您安装了本地maven仓库中指向您的remote_interface.jar的POM依赖关系,请考虑上述步骤(4)。 Follow this to know how.

    3. 引用is here

      的其他文档

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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