如标题所述,我无法从远程机器联系我的 EJB。尝试联系 EJB 托管机器的客户端在本地使用时工作得很好。
远程机器在 Windows XP SP3(32 位)和 Java JRE 7_71 上。它连接到与在 Glasshfish 服务器上运行 EJB 的机器相同的网络。
第二台机器(运行 Glasshfish 服务器)在 Win7 x64 上运行。分别安装了 JDK 1.7_75、JDK 1.8_25、jre1.8.0_25 和 JRE 7_71。
所有防火墙都被禁用。没有使用代理。连接到互联网的路由器后面只有 2 台机器。
我正在使用 NetBeans 8.0.2 和 Glasshfish 服务器 4.1 进行编程。
这是它的样子: http://imgur.com/zl05ACG
“ABEJB”是我的 EJB。在 Properties > Sources 中,“Source/Binary Format is JDK 7”。在 Properties > Libraries 中,我添加了 JDBC 驱动程序(运行良好)并将 Java 平台设置为“JDK 1.7强>”。 注意:当我在 Glassfish 上部署我的 EJB 时,我得到了这些信息:
Infos: Portable JNDI names for EJB AJoyfulBean: [java:global/ABEJB/AJoyfulBean!EJB.NewSessionBeanRemote, java:global/ABEJB/AJoyfulBean]
Infos: Glassfish-specific (Non-portable) JNDI names for EJB AJoyfulBean: [ABS/AJoyfulBean#EJB.NewSessionBeanRemote, ABS/AJoyfulBean]
NewSessionBean.java :
@Stateless(name = "AJoyfulBean")
public class NewSessionBean implements NewSessionBeanRemote
{
@Override
public String testConnexion()
{
String retour = "Connected to : " + System.getenv("COMPUTERNAME");
try
{
retour += " / " + InetAddress.getLocalHost();
}
catch (UnknownHostException ex)
{
retour += "unknown IP ! :(";
}
return retour;
}
}
NewSessionBeanRemote.java
@Remote
public interface NewSessionBeanRemote
{
String testConnexion();
}
sun-ejb-jar.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>AJoyfulBean</ejb-name>
<jndi-name>ABS/AJoyfulBean</jndi-name>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
“A Better Stock”是我在远程机器上的 Java 应用程序。在 Properties > Sources 中,“Source/Binary Format is JDK 7”。在 Properties > Libraries 中,我添加了来自 NetBeans 的“来自 GlassFish 的 Java EE”库和来自Glassfish 安装目录。Java 平台设置为“JDK 1.7”。 EJB 接口(interface)与我的 EJB 相同(反正我没有遇到 Marchal 异常)。
在我的主类的静态方法中:
try
{
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.164"); // the IP of the machine hosting the glassfish server
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);
NewSessionBeanRemote myEJB = (NewSessionBeanRemote) ctx.lookup("java:global/ABEJB/AJoyfulBean!EJB.NewSessionBeanRemote"); // Tried "ABS/AJoyfulBean#EJB.NewSessionBeanRemote" too
jTextAreaInformations.setText(jTextAreaInformations.getText() + "\n" + myEJB.testConnexion());
}
catch (Exception ex)
{
jTextAreaInformations.setText(jTextAreaInformations.getText() + "\n" + ex.toString());
}
list .MF :
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.8.0_25-b18 (Oracle Corporation)
Class-Path: lib/javax.annotation-api.jar lib/jaxb-api.jar lib/webservi
ces-api-osgi.jar lib/bean-validator.jar lib/javax.batch-api.jar lib/j
avax.ejb-api.jar lib/javax.el.jar lib/javax.enterprise.concurrent-api
.jar lib/javax.enterprise.concurrent.jar lib/javax.enterprise.deploy-
api.jar lib/javax.faces.jar lib/javax.inject.jar lib/javax.intercepto
r-api.jar lib/javax.jms-api.jar lib/javax.json.jar lib/javax.mail.jar
lib/javax.management.j2ee-api.jar lib/javax.persistence.jar lib/java
x.resource-api.jar lib/javax.security.auth.message-api.jar lib/javax.
security.jacc-api.jar lib/javax.servlet-api.jar lib/javax.servlet.jsp
-api.jar lib/javax.servlet.jsp.jar lib/javax.servlet.jsp.jstl-api.jar
lib/javax.servlet.jsp.jstl.jar lib/javax.transaction-api.jar lib/jav
ax.websocket-api.jar lib/javax.ws.rs-api.jar lib/javax.xml.registry-a
pi.jar lib/javax.xml.rpc-api.jar lib/jaxb-osgi.jar lib/webservices-os
gi.jar lib/weld-osgi-bundle.jar lib/jaxm-api.jar lib/gf-client.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: a.better.stock.UI.Accueil
当我在托管 glassfish 服务器的机器上运行我的客户端的 .jar 文件(带有/lib 文件夹)时,我的 EJB 被联系并且正确地执行所需的任务(更新 SQL 表)。 但是当我将 .jar 文件和/lib 文件夹复制到远程机器并执行它时,它得到了这个 exception :
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory
[Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
所以基本上,为什么我会收到此异常?我正在提供上下文。无论如何,它适用于本地但不适用于远程客户端。诡异的。
最佳答案
您如何启动您的客户端?从哪个目录?和本地目录一样吗?也许可能是您的客户的类路径不正确?甚至不完整?
我认为可能是 lib/文件夹中的某些 jar 文件需要正确文件夹结构中的其他 jar。例如,您可以在 appserv-rt.jar/META-INF/MANIFEST.MF 中看到。在那里你可以找到“类路径:../lib/gf-client.jar”条目。解决方案可能是您从 lib/文件夹中或从 bin/目录中运行您的客户端,就像 Glassfish 一样..
关于java - 无法从远程机器联系 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172929/