如何配置WildFly 10使用WEB-INF/lib中的JSF包而非自带实现
解决WildFly 10优先使用WEB-INF/lib中JSF实现的配置方法
嗨,这个问题我之前帮不少开发者处理过,WildFly默认会优先加载自身内置的JSF模块,要切换成你项目WEB-INF/lib下的JSF包,只需要做以下几步配置:
1. 创建/修改jboss-deployment-structure.xml文件
在你的WEB-INF目录下新建(如果已有则修改)这个文件,通过它来告诉WildFly排除内置的JSF相关模块,让类加载器优先加载你lib里的包。配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <!-- 排除WildFly内置的JSF子系统 --> <exclude-subsystems> <subsystem name="jsf" /> </exclude-subsystems> <!-- 排除具体的JSF API和实现模块 --> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> </deployment> </jboss-deployment-structure>
这里的核心是通过<exclude-subsystems>关闭内置JSF子系统的自动加载,再用<exclusions>排除具体的API和实现模块,确保WildFly不会去加载自带的JSF包。
2. 确保WEB-INF/lib中有完整的JSF包
把你想用的JSF API和实现包放到WEB-INF/lib下,比如如果你用Mojarra,就需要javax.faces.jar(API包)和jsf-impl.jar(实现包);如果是MyFaces,对应就是myfaces-api.jar和myfaces-impl.jar。注意要保证两个包版本匹配,避免出现兼容性问题。
3. EAR部署的特殊配置(如果适用)
如果你的项目是EAR包形式,需要在jboss-deployment-structure.xml中针对WAR子部署添加同样的排除规则,示例如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <sub-deployment name="your-web-module.war"> <exclude-subsystems> <subsystem name="jsf" /> </exclude-subsystems> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> </sub-deployment> </jboss-deployment-structure>
额外注意事项
- 如果你使用的是JSF 2.3及以上版本,记得在
web.xml中添加对应的上下文参数,确保CDI等特性正常工作:
<context-param> <param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name> <param-value>true</param-value> </context-param>
- 部署前可以清理WildFly的临时目录(
standalone/tmp和standalone/data),避免残留的旧JSF类影响加载。
内容的提问来源于stack exchange,提问作者user1374266
相关产品推荐
相关产品推荐

