Java 如何为独立客户端设置Glassfish 3.1.2的JNDI?
我尝试从一个独立的swing客户机(在客户机上一个单独的JVM中运行)连接到Glassfish服务器 我目前使用Netbeans的以下设置,一切正常:Java 如何为独立客户端设置Glassfish 3.1.2的JNDI?,java,glassfish,java-ee-6,initial-context,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.enterpris
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)
D:\workspace\gf client\dist>java-jar gf-client.jar
17.08.2012 11:07:38 ch.client.core.ServerContext getInitialContext SCHWERWIEGEND:无法实例化类:com.sun.enterprise.naming.SerialInitContextFactory javax.naming.NoInitialContextException:无法实例化类:com.sun.enterprise.naming.SerialInitContextFactory[根异常为java.lang.ClassNotFoundException:com.sun.enterprise.naming.SerialInitContextFactory]
位于javax.naming.spi.NamingManager.getInitialContext(未知源)
位于javax.naming.InitialContext.getDefaultInitCtx(未知源)
位于javax.naming.InitialContext.init(未知源)
位于javax.naming.InitialContext。(未知源)
位于ch.lawsuite.core.ServerContext.getInitialContext(ServerContext.java:27)
位于ch.client.core.remote.Facades.initialize(Facades.java:68)
在ch.client.core.client.main(client.java:57)处,由以下原因引起:java.lang.ClassNotFoundException:com.sun.enterprise.naming.SerialIni tContextFactory
位于java.net.URLClassLoader$1.run(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
位于sun.misc.Launcher$AppClassLoader.loadClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(未知源)
位于com.sun.naming.internal.VersionHelper12.loadClass(未知源)
…线程“main”java.lang.NullPointerException中还有7个异常
位于ch.client.core.remote.Facades.initialize(Facades.java:69)
位于ch.client.core.client.main(client.java:57)
有人有什么有用的主意吗
- JVM是否缺少任何LIB?哪些?(它从netbeans工作,所有依赖的LIB都打包到已编译的jar文件中(至少我认为是这样)
- Glassfish是否有其他系列上下文工厂
非常感谢您的帮助!您的类路径中缺少包含com.sun.enterprise.naming.SerialInitialContextFactory类的jar。请将其添加到客户端jar的清单中。通过查看gf-client.jar库的manifest.MF文件,我注意到从为了在netbeans平台之外运行客户端,我必须将所有这些LIB复制到我自己的应用程序的最终版本中。然后它就可以正常工作了…:-)这是关于远程EJB接口的一点 当客户端应用程序位于不同于承载EJB模块的JVM的JVM上时,您需要远程EJB接口。换句话说:
- 客户端应用程序位于一个JVM上,EJB模块部署在同一台机器上的另一个JVM上
- 客户端应用程序位于一个JVM上,EJB模块部署在远程机器上的另一个JVM上
让我们考虑第一个场景,客户机应用程序和EJB模块都在同一台机器上使用不同的JVM。
InitialContext context = new InitialContext();
_RemoteEjbInterface ejbBean = (_RemoteEjbInterface) context.lookup("java:global/DeployedEJBAppName/EjbImplClass!com.sam._RemoteEjbInterface");
如果您的SE独立客户端应用程序是maven应用程序,那么您需要
<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>
org.glassfish.main.appclient.client
另一个要引用的文档也许这可以帮助您:我将从glassfish使用appclient运行,如果必要的话,制作一个脚本来启动它。我知道这个类在appserv-rt.jar中,而这个类又被gf client.jar的清单文件引用,该文件实际上在我的类路径上。我如何告诉Netbeans包含被包含的lib的清单文件引用?而您只是将这些jar包含在应用程序的/lib文件夹中?不,保持所有这些glassfish lib的结构是非常重要的!因此您必须将gf-client.jar添加到与glassfish安装目录相对应的lib中。这意味着:将gf-client.jar保留在glassfish/lib/gf中-只要从项目中指向该jar即可,请确保glassfish文件夹的引用方式与以前相同。如果您需要更多信息,请告诉我…嗯,很有趣。gf客户端是主要要求?是的。添加gf-client.jar作为第一个库,否则您将与其他jar(我想它是java-ee-7.jar)发生名称冲突。全局JNDI名称是否会根据需要更改