【问题标题】:How to setup JNDI for Glassfish 3.1.2 for a stand-alone client?如何为独立客户端的 Glassfish 3.1.2 设置 JNDI?
【发布时间】:2012-08-17 09:11:28
【问题描述】:

我尝试从独立的 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 是否有替代的串行上下文工厂?

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

【问题讨论】:

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


【解决方案1】:

关于远程 EJB 接口的一点说明

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

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

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

为简单起见

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

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

关于客户的重要提示

根据文档,独立 Java 客户端必须显式使用全局 JNDI 名称来查找远程 EJB。此外,Glassfish 不需要任何属性初始化来调用 InitialContext() 构造函数。因此,客户端应用程序可以使用以下 sn-p 调用 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

【讨论】:

  • 全局 JNDI 名称是否会根据 EAR 是部署到本地主机还是远程服务器而改变?我天真地期望 EAR 会明确指定确切的全局 JNDI 名称...?
  • 救了我的命。 3 周的调试。
【解决方案2】:

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

【讨论】:

  • 而您只需将这些 jar 包包含在应用程序的 /lib 文件夹中?
  • 不,保持所有这些 glassfish 库的结构非常重要!因此,您必须将 gf-client.jar 添加到相对于 glassfish 安装目录的库中。这意味着:将 gf-client.jar 留在 glassfish/lib/gf-client.jar 中,然后从您的项目中指向该 jar。如果您想在 IDE 之外(作为独立)运行您的应用程序,请确保以与以前相同的方式引用 glassfish 文件夹。如果您需要更多信息,请告诉我...
  • 嗯,很有趣。 gf-client 是主要要求吗?
  • 是的。将 gf-client.jar 添加为第一个 lib,否则会遇到与其他 jar 的名称冲突(我认为是 java-ee-7.jar)。
【解决方案3】:

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

【讨论】:

  • 我知道这个类在 appserv-rt.jar 中,而 gf-client.jar 的 Manifest 文件又引用了它,该文件实际上在我的类路径中。如何告诉 Netbeans 包含被包含库的清单文件引用的库?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多