WildFly 11部署WAR包遇WeldStartService启动失败求助
解决WildFly 11部署WAR时WeldStartService启动失败的问题
嘿,我看了你的问题和POM配置,确实是依赖配置出了问题——WildFly 11作为Java EE 7兼容的应用服务器,自带了大部分Java EE规范的实现,你手动添加的几个依赖要么版本不兼容,要么完全冗余,直接导致了Weld(CDI容器)启动失败。具体问题和修复方案如下:
核心问题分析
- Java EE API版本不兼容:你使用的
javaee-web-api:8.0对应Java EE 8规范,但WildFly 11仅支持Java EE 7,过高的API版本会和服务器内置类库直接冲突,必须降级到匹配的版本。 - 冗余的Weld依赖:WildFly本身已经内置了Weld(CDI的官方参考实现),手动引入的
weld-servlet:2.4.5.Final完全多余,且版本与服务器内置Weld不匹配,这是WeldStartService启动失败的核心原因。 - Servlet API版本冲突:
javax.servlet-api:4.0.0是Servlet 4.0规范(对应Java EE 8),但WildFly 11使用的是Servlet 3.1,且服务器已经提供了Servlet API实现,这个依赖要么冗余要么版本不匹配。 - 老旧冗余的EL依赖:
com.sun.el:el-ri:1.0是非常老旧的EL表达式实现,WildFly自带了符合Java EE规范的EL容器,这个依赖只会引发类库冲突。 - JSF版本适配问题:你用的
javax.faces:2.3.3是JSF 2.3版本,而WildFly 11默认内置JSF 2.2,若不需要2.3特性,建议适配服务器内置版本;若必须用2.3,需额外配置WildFly。
修正后的POM依赖示例
<dependencies> <!-- JSF依赖:若不需要2.3特性,建议替换为WildFly内置的2.2.x版本(如2.2.14.SP1)并保持provided scope --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.3.3</version> <!-- 若要使用外部JSF 2.3,需去掉provided并配置WildFly服务器,否则保持provided --> <scope>provided</scope> </dependency> <!-- Java EE 7 Web API,匹配WildFly 11的规范版本 --> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <!-- 通用日志依赖,无冲突可保留 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- JSTL依赖,服务器通常不自带完整实现,可保留 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 测试依赖,仅在测试阶段生效,可保留 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>catalina</artifactId> <version>6.0.53</version> <scope>test</scope> </dependency> </dependencies>
额外配置(若需使用JSF 2.3)
如果确实需要JSF 2.3的特性,除了保留上述依赖外,还需修改WildFly配置:
- 下载JSF 2.3的模块包,替换WildFly目录
modules/system/layers/base/com/sun/jsf-impl/main下的原有文件; - 修改
standalone.xml中的JSF子系统配置,将default-jsf-impl-slot设置为2.3(对应你放置的模块版本)。
调整完依赖后,重新打包WAR包部署到WildFly 11,应该就能解决WeldStartService启动失败的问题了。核心原则是尽量复用应用服务器内置的Java EE类库,避免手动引入服务器已提供的依赖,确保依赖版本与服务器支持的规范版本匹配。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

