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

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

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

最佳答案

关于远程 EJB 接口(interface)需要澄清的一点

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

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

或者

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

为了简单起见

让我们考虑第一个场景,其中客户端应用程序和 EJB 模块都位于同一台计算机上的不同 JVM 上。

  1. 确保您的计算机上安装了 2 个 JDK。
  2. 在指向一个 JDK (JVM) 的 Glassfish 安装中部署 EJB 模块。我们可以同意将 Glassfish 安装在“C:/glassfish3/”
  3. 根据此 link 中的文档。将文件“gf-client.jar”作为安装目录(即 C:/glassfish3/glassfish/lib/gf-client.jar)中的外部库添加到客户端应用程序类路径,而不是复制它。
  4. 还将文件remote_interface.jar 添加到您的客户端应用程序类路径中,其中包含EJB 的远程业务接口(interface)。
  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)。 Follow this to know how.

另一个可供引用的文档 is here

关于java - 如何为独立客户端设置 Glassfish 3.1.2 的 JNDI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946581/

相关文章:

java - 回收站 View : No adapter attached; skipping layout in Activity

java - Servlet 不工作 :HTTP Status 404

java - Gradle构建子项目取决于其他子项目

glassfish - Glassfish 最简单的 apache mod_proxy 配置是什么?

security - JACC 提供程序如何使用其部署的服务器的主体到角色映射功能?

java - HTTP 状态 500 - 内部服务器错误 - JSP - Glass Fish 服务器

Java EE - 并行编辑,多个用户,有什么想法吗?

java - 为 dev/QA/prod 配置 Java EE 6

java - 如何计算执行时间?

java - 在 Android 中访问 Earthquake API。未知主机异常