You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GlassFish/WildFly上创建部署EJB应用及整合Servlet的技术疑问

我来一步步帮你理清这两个问题,都是EJB Web集成里的常见场景,别担心~

一、Servlet/JSP如何调用你的EJB项目?

有两种主流方式,看你想把EJB做成独立组件还是和Web模块放一起:

方式1:把EJB和Web模块打包到同一个EAR(推荐新手)

这种方式最省心,不用处理跨模块的依赖和JNDI查找:

  • 先创建一个Enterprise Application(EAR)项目,把你现有的EJB JAR模块添加到这个EAR里
  • 接着在同一个EAR下新建一个Web Module(WAR),用来放你的Servlet、JSP和网页表单
  • 在Servlet里直接用@EJB注解注入你的EJB本地/远程Bean就行,比如:
@WebServlet("/addStudentAndGrade")
public class AddDataServlet extends HttpServlet {
    // 注入本地Bean(本地调用性能更好,适合同服务器内的调用)
    @EJB
    private StudentBeanLocal studentBean;
    @EJB
    private GradeBeanLocal gradeBean;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 从表单获取用户输入
        String studentName = request.getParameter("studentName");
        String gradeName = request.getParameter("gradeName");
        
        // 调用EJB方法插入数据
        Student newStudent = new Student();
        newStudent.setName(studentName);
        studentBean.saveStudent(newStudent);

        Grade newGrade = new Grade();
        newGrade.setName(gradeName);
        newGrade.setStudent(newStudent);
        gradeBean.saveGrade(newGrade);

        // 跳转回表单或者成功页面
        response.sendRedirect("addData.jsp");
    }
}

EAR里的所有模块共享同一个类加载上下文,所以@EJB注入会自动生效,不用额外配置。

方式2:EJB和Web模块分开部署(适合EJB复用场景)

如果你想让EJB成为独立的可复用组件,比如给多个Web项目调用,可以这么做:

  1. 先把你的EJB JAR部署到服务器上,服务器会自动把EJB注册到JNDI目录
  2. 在你的Web项目(WAR)里,只需要添加EJB的接口类依赖(不要加实现类,避免类加载冲突)
  3. 在Servlet里可以通过JNDI查找EJB,或者部分服务器支持直接用@EJB注入(前提是EJB已经部署)
    举个JNDI查找的例子(GlassFish和WildFly的JNDI命名格式略有不同):
// GlassFish的本地BeanJNDI格式:java:global/EJB模块名/Bean类名!全限定接口名
StudentBeanLocal studentBean = (StudentBeanLocal) new InitialContext()
    .lookup("java:global/MyEJBProject/StudentBean!com.example.ejb.StudentBeanLocal");

// WildFly的本地BeanJNDI格式:java:global/EJB部署名/Bean类名!全限定接口名
StudentBeanLocal studentBean = (StudentBeanLocal) new InitialContext()
    .lookup("java:global/MyEJBProject/StudentBean!com.example.ejb.StudentBeanLocal");
二、脱离IDE手动部署到GlassFish/WildFly的步骤

不管是哪种服务器,核心都是先打包项目,再传到服务器部署,具体步骤如下:

部署到GlassFish

  1. 打包项目
    • 如果是EAR项目:用Maven执行mvn package,或者手动用jar命令打包,确保EAR包含EJB JAR、WAR和正确的application.xml(IDE创建的话会自动生成)
    • 如果是分开的EJB JAR和WAR:分别打包成.jar和.war文件
  2. 启动并部署
    • 启动GlassFish:运行glassfish/bin/asadmin start-domain(默认域是domain1)
    • 部署EAR:执行asadmin deploy /本地路径/your-project.ear
    • 分开部署的话:先部署EJBasadmin deploy /本地路径/your-ejb.jar,再部署WARasadmin deploy /本地路径/your-web.war
    • 验证部署:访问GlassFish管理控制台(默认http://localhost:4848),在「Applications」里查看部署状态
  3. 测试功能:访问你的Servlet地址,比如http://localhost:8080/your-web-context/addStudentAndGrade

部署到WildFly

  1. 打包项目
    • 用Maven执行mvn package,或者手动打包,WildFly支持EAR、独立EJB JAR和WAR格式
    • 若有自定义EJB配置,确保jboss-ejb3.xml放在EJB项目的META-INF目录下(无自定义需求可以省略)
  2. 启动并部署
    • 启动WildFly:运行wildfly/bin/standalone.sh(Linux/Mac)或standalone.bat(Windows)
    • 部署方式二选一:
      • 自动部署:把打包好的文件(EAR/WAR/JAR)复制到wildfly/standalone/deployments目录,WildFly会自动检测并部署
      • CLI部署:运行wildfly/bin/jboss-cli.sh --connect连接服务器,然后执行deploy /本地路径/your-project.ear
    • 验证部署:访问WildFly管理控制台(默认http://localhost:9990),在「Deployments」里查看状态
  3. 测试功能:访问Web项目的地址,比如http://localhost:8080/your-web-context/addStudentAndGrade
几个注意事项
  • 确保你的persistence.xml配置正确,并且服务器上已经配置好对应的JDBC连接池(GlassFish在管理控制台的「JDBC连接池」创建,WildFly可以修改standalone.xml或用CLI添加)
  • 如果用远程EJB,需要注意服务器的远程连接端口:GlassFish默认IIOP端口是3700,WildFly默认远程端口是8080(不同版本可能有差异)
  • 部署出错时,去服务器日志目录排查:GlassFish日志在glassfish/domains/domain1/logs,WildFly日志在wildfly/standalone/log

内容的提问来源于stack exchange,提问作者Ovidiu G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:36