Tomcat8.5+WELD3搭建JSF2.3/CDI2项目遇废弃API警告求解决
嘿,这个警告我之前也碰到过,本质是Mojarra(JSF的官方实现)里的com.sun.faces.flow.FlowDiscoveryCDIHelper类还在沿用CDI 1.1就被废弃的老API,而你用的WELD 3是CDI 2.x的实现,所以启动时就会弹出这个提示。下面给你几个靠谱的解决方向:
1. 升级Mojarra到适配CDI 2.x的版本
你现在的pom里只加了JSF的API依赖,没加具体的实现包(Mojarra),这首先得补上。而且旧版本的Mojarra确实没适配CDI 2,得升级到修复了这个问题的版本(一般2.3.10及以后的Mojarra版本都搞定了这个废弃API的调用)。
在pom.xml里更新JSF相关依赖:
<!-- JSF API 接口 --> <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency> <!-- Mojarra 官方JSF实现 --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.3.19</version> <!-- 选最新的2.3.x稳定版就行 --> <scope>compile</scope> </dependency>
要是你的Tomcat容器里已经提前放了Mojarra的jar包,记得把上面实现依赖的<scope>改成provided,避免版本冲突哦。
2. 让WELD直接忽略这个警告
如果暂时没法升级Mojarra,也可以直接让WELD屏蔽这个特定警告。在项目的src/main/resources/META-INF目录下新建一个jboss.properties文件,往里加一行:
org.jboss.weld.bootstrap.warning.ignore=WELD-000146
这样WELD启动时就会自动跳过这个警告信息了。
3. 确认WELD和CDI的版本匹配
别忘了检查WELD版本和CDI 2.x的兼容性——WELD 3.x是专门对应CDI 2.0的,别不小心用成WELD 4.x(那是给CDI 3.0/Jakarta EE 9+用的)。比如可以用这个稳定的WELD 3.x依赖:
<dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-shaded</artifactId> <version>3.1.9.Final</version> <scope>compile</scope> </dependency>
最后说一句
其实这个警告只是个“提醒”,不会影响应用正常运行。但从长期维护的角度看,优先升级Mojarra到适配版本是最好的选择,毕竟废弃API早晚可能被移除嘛。
内容的提问来源于stack exchange,提问作者Jens Fuchs

