java - 无法从远程机器联系 EJB

标签 java jakarta-ee netbeans glassfish ejb

如标题所述,我无法从远程机器联系我的 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/

相关文章:

java - 使用netbeans设计的java中设置布局以调整控件大小

java - BufferedReader 和 InputStream 的 getResourceAsStream 的使用

java - 以循环方式从 map /任何集合中获取值

java - 我无法获取文件路径

java - Glassfish 5.1 服务器在启用安全管理后无法启动(NoClassDefFoundError : sun/security/ssl/HelloExtension)

java - 为什么我们在同一台服务器上使用多个应用程序服务器实例

java - 在 if 语句的第二级之后无法将输出打印到正确的小数点

java - 没有错误但没有音频?

java - 创建变量是否比编写大量代码更好?

java - Java 中字节不显示加法结果