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>
解决方案
修正拼写错误:报错中的
org.myappp.InfossStatelessLocal存在两处拼写错误——包名多了一个p(应为org.myapp)、类名错误(应为MyAppStatelessLocal)。检查代码中EJB注入的类名、导入语句,确保与实际EJB本地接口的包名和类名完全一致。调整EJB依赖范围:
- 如果单独部署
myapp-ws.war,将其pom.xml中EJB依赖的<scope>provided</scope>改为<scope>compile</scope>,确保EJB接口类被打包到war中。 - 如果将
myapp-ws.war打包到EAR中部署,保留provided范围,但需确保EAR的类加载机制能让war模块访问到EJB模块。
- 如果单独部署
显式声明模块依赖(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>
- 验证包路径一致性:代码中导入的EJB接口是
myapp.lab.MyAppStatelessLocal,但报错中查找的是org/myapp/MyAppStatelessLocal,包路径不匹配。确认EJB本地接口的实际包名,修正代码中的导入语句或EJB接口的包结构,保持两者一致。
内容的提问来源于stack exchange,提问作者user8128167
相关产品推荐
相关产品推荐

