0

0

在WildFly中集成EJB与JAX-WS:解决部署与访问难题

霞舞

霞舞

发布时间:2025-09-01 12:27:07

|

842人浏览过

|

来源于php中文网

原创

在WildFly中集成EJB与JAX-WS:解决部署与访问难题

本文详细介绍了在WildFly应用服务器上,将EJB(Enterprise JavaBeans)与JAX-WS(Java API for XML Web Services)项目整合到EAR(Enterprise Archive)中的实践。教程涵盖了多模块Maven项目结构、依赖管理、以及如何解决部署过程中常见的NoClassDefFoundError类加载问题,并指导读者正确访问已部署Web服务的WSDL定义。

概述:EJB与JAX-WS在EAR中的集成

在企业级java应用开发中,将业务逻辑封装为ejb,并通过jax-ws暴露为web服务是一种常见模式。为了更好地管理和部署这些组件,通常会将它们打包到一个ear文件中。本教程将以一个典型的多模块maven项目为例,演示如何配置项目、解决部署时可能遇到的类加载问题,并最终成功访问web服务。

项目结构与Maven依赖管理

一个典型的EJB与JAX-WS集成项目通常包含以下Maven模块:

  • 父项目 (myapp-app): 管理所有子模块的公共依赖和版本。
  • EJB模块 (myapp-ejb): 包含业务逻辑的EJB接口和实现。
  • Web服务模块 (myapp-ws): 包含JAX-WS服务接口和实现,并通过@EJB注解注入EJB。
  • EAR模块 (myapp-ear): 将EJB模块和Web服务模块打包在一起,形成一个可部署的企业级应用。

以下是相关pom.xml文件的关键配置片段,展示了这些模块之间的依赖关系:

1. 父项目 pom.xml (myapp-app)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.myapp</groupId>
    <artifactId>myapp-app</artifactId>
    <packaging>pom</packaging>
    <version>0.1.0</version>
    <modules>
        <module>myapp-ejb</module>
        <module>myapp-web</module>      
        <module>myapp-ear</module>
        <module>myapp-ws</module>       
    </modules>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <version.server.bom>18.0.1.Final</version.server.bom>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.wildfly.bom</groupId>
                <artifactId>wildfly-jakartaee8-with-tools</artifactId>
                <version>${version.server.bom}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>               
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>myapp-ejb</artifactId>
                <version>${project.version}</version>
                <type>ejb</type>
            </dependency>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>myapp-ws</artifactId>
                <version>${project.version}</version>
                <type>war</type>
                <scope>compile</scope>
            </dependency>                   
        </dependencies>
    </dependencyManagement>
    <!-- ... 其他配置 ... -->
</project>

2. EAR项目 pom.xml (myapp-ear)

EAR项目负责将WAR和EJB打包。请确保在dependencies中正确引用了EJB和Web服务模块。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.myapp</groupId>
    <artifactId>myapp-ear</artifactId>
    <packaging>ear</packaging>
    <version>0.1.0</version>
    <name>myapp-ear</name>
    <parent>
        <groupId>org.myapp</groupId>
        <artifactId>myapp-app</artifactId>
        <version>0.1.0</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>myapp-ejb</artifactId>
            <type>ejb</type>
            <version>0.1.0</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>myapp-ws</artifactId>
            <type>war</type>
            <version>0.1.0</version> <!-- 明确版本,或继承自父pom -->
        </dependency>       
    </dependencies>
    <!-- ... 其他配置,如maven-ear-plugin ... -->
</project>

3. Web服务项目 pom.xml (myapp-ws)

Web服务模块需要EJB接口来进行编译和类型检查,但在运行时,EJB实例将由容器提供。因此,将EJB模块的依赖范围设置为provided是关键,这可以避免将EJB JAR重复打包到WAR中,并依赖EAR容器的类加载机制。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.myapp</groupId>
    <artifactId>myapp-ws</artifactId>
    <packaging>war</packaging>
    <version>0.1.0</version>
    <name>myapp-ws Maven Soap WS</name>
    <parent>
        <groupId>org.myapp</groupId>
        <artifactId>myapp-app</artifactId>
        <version>0.1.0</version>
    </parent>
    <dependencies>
        <!-- ... 其他依赖 ... -->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>myapp-ejb</artifactId>
            <type>ejb</type>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <!-- ... 其他配置 ... -->
</project>

解决部署时的NoClassDefFoundError

在WildFly中,当一个WAR包部署在EAR内部时,它通常可以访问EAR中其他模块(如EJB JAR)的类。然而,有时会遇到java.lang.NoClassDefFoundError或java.lang.ClassNotFoundException,特别是在Web服务模块尝试通过反射获取EJB接口信息时。错误信息通常类似:

WFLYSRV0153: Failed to process phase POST_MODULE of deployment "myapp-ws.war"
Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class org.ws.MyAppWSImpl with ClassLoader ModuleClassLoader for Module "deployment.myapp-ws.war"
Caused by: java.lang.NoClassDefFoundError: Lorg/myapp/MyAppStatelessLocal;
Caused by: java.lang.ClassNotFoundException: org.myapp.MyAppStatelessLocal from [Module "deployment.myapp-ws.war"]

这表明尽管myapp-ejb被包含在EAR中,但myapp-ws.war的类加载器在部署阶段未能找到MyAppStatelessLocal接口。为了明确告知WildFly myapp-ws.war依赖于myapp-ejb.jar,可以在myapp-ws.war的WEB-INF/目录下添加一个jboss-deployment-structure.xml文件。

1. 创建 jboss-deployment-structure.xml

在myapp-ws项目的src/main/webapp/WEB-INF/目录下创建或编辑jboss-deployment-structure.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <!-- 明确声明对EAR内部EJB模块的依赖 -->
            <module name="deployment.myapp-ear.ear.myapp-ejb.jar" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

这里的module name格式deployment..ear.是WildFly中引用EAR内部子部署的约定。这会确保myapp-ws.war的类加载器能够正确地访问myapp-ejb.jar中的类。

ChatGPT Writer
ChatGPT Writer

免费 Chrome 扩展程序,使用 ChatGPT AI 生成电子邮件和消息。

下载

2. Web服务实现 (MyAppWSImpl.java)

Web服务实现类通过@EJB注解注入EJB,这是Java EE规范的标准做法。

package myapp.ws;

import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebService;
import myapp.lab.MyAppStatelessLocal; // 确保导入EJB接口

@WebService(endpointInterface = "myapp.ws.MyAppWS")
public class MyAppWSImpl implements MyAppWS {
    @EJB
    MyAppStatelessLocal masl; // 注入EJB本地接口

    @WebMethod()
    public String predict(int value) {
        return masl.getPrediction(value);
    }
}

3. Web服务配置 (web.xml)

web.xml用于配置Servlet和Servlet映射,JAX-WS服务通常通过Servlet暴露。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>myapp-ws</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>myappws</servlet-name>
    <servlet-class>myapp.ws.MyAppWSImpl</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>myappws</servlet-name>
    <url-pattern>/myappws</url-pattern>
  </servlet-mapping>

</web-app>

这里的定义了Web服务的访问路径,这对于后续访问WSDL至关重要。

访问已部署Web服务的WSDL

在成功部署EAR文件到WildFly服务器后,Web服务即可通过HTTP协议访问。为了获取Web服务的WSDL(Web Services Description Language)定义,需要使用正确的URL。

根据web.xml中定义的,Web服务的访问路径是/myappws。因此,正确的WSDL访问URL应为:

http://localhost:8080/myapp-ws/myappws?wsdl

注意事项:

  • localhost:8080是WildFly服务器的默认地址和端口,如果你的配置不同,请相应修改。
  • myapp-ws是Web服务模块的上下文根(通常与WAR文件的名称相同)。
  • myappws是web.xml中定义的url-pattern。
  • ?wsdl是标准后缀,用于请求Web服务的WSDL定义。

错误地使用服务实现类名(例如http://localhost:8080/myapp-ws/MyAppWSImpl?wsdl)将无法获取WSDL,因为JAX-WS运行时通常根据web.xml中的Servlet映射来暴露WSDL,而不是直接基于实现类名。

总结与最佳实践

在WildFly中集成EJB与JAX-WS并将其打包到EAR中,需要细致的Maven配置和对Java EE类加载机制的理解。

  1. Maven依赖管理:确保EJB模块在Web服务模块中被声明为provided范围,避免JAR文件重复打包。
  2. EAR打包:myapp-ear的pom.xml必须正确引用所有内部模块(EJB JAR和WAR)。
  3. WildFly类加载:当遇到NoClassDefFoundError时,jboss-deployment-structure.xml是解决WAR内部模块对EAR中其他模块(如EJB)显式依赖的有效方法。
  4. Web服务配置:web.xml中的定义了Web服务的实际访问路径,这直接影响WSDL的URL。

遵循这些步骤和最佳实践,可以有效地在WildFly环境中构建和部署健壮的企业级Web服务应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

390

2023.08.08

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1939

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2116

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1146

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1774

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

570

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2340

2025.12.29

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号