Wildfly JavaEE 8环境下@Singleton启动EJB两次初始化问题排查
问题诱因
核心根因:类加载器隔离导致的重复实例化
Jakarta EE规范中@Singleton的单例性仅限定在单个类加载器上下文范围内,而非JVM全局。你遇到的两次初始化本质是Bootstrap类被两个不同的类加载器分别加载、实例化:
- 第一次由EAR全局类加载器加载EAR根目录下独立部署的
test-ejb.jar模块,触发@Startup逻辑 - 第二次由test-web模块的私有类加载器加载
WEB-INF/lib下打包进去的test-ejb.jar副本,再次触发实例化
即便你给test-web配置了provided范围的test-ejb依赖,该原型默认的maven-war-plugin配置也可能没有开启对应依赖排除,导致test-ejb.jar同时出现在EAR根目录和test.war/WEB-INF/lib两个位置。
次要可能性:部署扫描器重复触发部署
如果校验打包结果后确认test.war/WEB-INF/lib下无test-ejb.jar副本,则是Wildfly默认部署扫描器的配置问题:扫描间隔过短导致EAR包还没完全写入部署目录就被第一次扫描触发部署,写入完成后又触发第二次重部署,所有模块被重复加载。
解决方案
方案1:修复打包配置(优先执行)
- 首先解压打包好的
test.war,检查WEB-INF/lib下是否存在test-ejb.jar,如果存在,在test-web模块的pom.xml中调整maven-war-plugin配置,显式排除该依赖:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> <configuration> <packagingExcludes>WEB-INF/lib/test-ejb-*.jar</packagingExcludes> </configuration> </plugin>
- 检查test-ear模块的
pom.xml,确保依赖配置符合EAR打包规范:
<!-- test-ejb依赖配置 --> <dependency> <groupId>替换为你的项目groupId</groupId> <artifactId>test-ejb</artifactId> <version>替换为你的项目版本</version> <type>ejb</type> </dependency> <!-- test-web依赖配置 --> <dependency> <groupId>替换为你的项目groupId</groupId> <artifactId>test-web</artifactId> <version>替换为你的项目版本</version> <type>war</type> </dependency>
- 配置test-web的MANIFEST.MF直接引用EAR根目录下的ejb模块,避免重复加载:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <archive> <manifestEntries> <Class-Path>test-ejb-${project.version}.jar</Class-Path> </manifestEntries> </archive> </configuration> </plugin>
方案2:调整部署扫描器配置(仅打包无问题时执行)
修改Wildfly运行配置文件(默认是standalone/configuration/standalone.xml)中的部署扫描器配置,将扫描间隔调整为5秒以上,避免未写完就触发扫描:
<subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0"> <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" auto-deploy-zipped="true" auto-deploy-exploded="false" /> </subsystem>
也可以直接使用Wildfly控制台手动上传部署,或者jboss-cli命令行部署,完全避开扫描器的重复触发问题。
内容的提问来源于stack exchange,提问作者Stefano Cazzola
相关产品推荐
相关产品推荐

