3

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

非常感谢您提前提供的帮助!

4

3 回答 3

8

关于远程 EJB 接口的要点

当您的客户端应用程序位于一个不同于托管 EJB 模块的 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 不需要任何属性初始化来调用 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)。按照这个来了解如何。

另一个要参考的文档是here

于 2013-09-27T16:14:22.487 回答
1

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

于 2012-10-24T08:30:41.520 回答
0

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

于 2012-08-17T09:45:27.617 回答