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

WildFly部署myapp-ws.war失败:无法访问EJB类

问题:Web服务项目无法访问EJB模块中的本地接口,部署失败

报错信息

部署myapp-ws.war时触发POST_MODULE阶段失败,具体错误如下:

{"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"myapp-ws.war\".POST_MODULE" => "WFLYSRV0153: Failed to process phase POST_MODULE of deployment \"myapp-ws.war\"\n    Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class org.ws.MyAppWSImpl with ClassLoader ModuleClassLoader for Module \"deployment.myapp-ws.war\" from Service Module Loader\n    Caused by: java.lang.NoClassDefFoundError: Lorg/myapp/MyAppStatelessLocal;\n    Caused by: java.lang.ClassNotFoundException: org.myappp.InfossStatelessLocal from [Module \"deployment.myapp-ws.war\" from Service Module Loader]"}}

项目依赖配置

根pom.xml

<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>
        <root.dir>${project.basedir}</root.dir>
        <jboss.home.name>JBOSS_HOME</jboss.home.name>
        <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>
        <version.wildfly.maven.plugin>2.0.0.Final</version.wildfly.maven.plugin>
        <version.jaxws-tools-maven-plugin>1.2.3.Final</version.jaxws-tools-maven.plugin>
    </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-web</artifactId>
                <version>${project.version}</version>
                <type>war</type>
                <scope>compile</scope>
            </dependency>           
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>myapp-ws</artifactId>
                <version>${project.version}</version>
                <type>war</type>
                <scope>compile</scope>
            </dependency>                   
        </dependencies>
    </dependencyManagement>
    ...
</project>

EAR模块pom.xml

<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>
    <description>This project packages myapp-ejb and myapp-web in an EAR; this is the EAR POM file</description>
    <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-web</artifactId>
            <version>0.1.0</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>myapp-ws</artifactId>
            <type>war</type>
        </dependency>       
    </dependencies>
   ...
</project>

Web服务模块pom.xml

<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>
    ....
</project>

相关代码文件

MyAppWSImpl.java

package myapp.ws;

import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebService;
import myapp.lab.MyAppStatelessLocal;

@WebService(endpointInterface = "myapp.ws.MyAppWS")
public class MyAppWSImpl implements MyAppWS {
    @EJB
    MyAppStatelessLocal masl;
            
    @WebMethod()
    public String predict(int value) {
        return masl.getPrediction(value);
    }
}

web.xml

<?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>

解决方案

  1. 修正拼写错误:报错中的org.myappp.InfossStatelessLocal存在两处拼写错误——包名多了一个p(应为org.myapp)、类名错误(应为MyAppStatelessLocal)。检查代码中EJB注入的类名、导入语句,确保与实际EJB本地接口的包名和类名完全一致。

  2. 调整EJB依赖范围:

    • 如果单独部署myapp-ws.war,将其pom.xml中EJB依赖的<scope>provided</scope>改为<scope>compile</scope>,确保EJB接口类被打包到war中。
    • 如果将myapp-ws.war打包到EAR中部署,保留provided范围,但需确保EAR的类加载机制能让war模块访问到EJB模块。
  3. 显式声明模块依赖(EAR部署场景):在myapp-ws的WEB-INF目录下创建jboss-deployment-structure.xml,显式依赖EJB模块:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="deployment.myapp-ear.myapp-ejb.jar" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
  1. 验证包路径一致性:代码中导入的EJB接口是myapp.lab.MyAppStatelessLocal,但报错中查找的是org/myapp/MyAppStatelessLocal,包路径不匹配。确认EJB本地接口的实际包名,修正代码中的导入语句或EJB接口的包结构,保持两者一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:45:17