经常被一个问题困扰:


  JavaServer Faces 2.2 can not be installed : One or more constraints have not been satisfied.


  JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer


  eclipse里面是这样子的:



  通过Type来看是因为maven的配置导致的。


  今天决定解决这个问题:


  之前做的一些尝试:打算选择搞版本的Dynamic Web Module,但是报错,说是和其他组件冲突。


  于是你需要做两件事情:


  1. 修改web app版本;


  maven默认生成的web.xml中webapp的版本是2.3的:



1 <!DOCTYPE web-app PUBLIC
2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
3 "http://java.sun.com/dtd/web-app_2_3.dtd" >


  修改为web-app为4.0版本:



1 <!DOCTYPE web-app PUBLIC
2 "-//Sun Microsystems, Inc.//DTD Web Application 4.0//EN"
3 "http://java.sun.com/dtd/web-app_4_0.dtd" >


  其实只要是3.0以上就可以,我这里写的是4.0,最新版本的


   

  开始好用,但是当工程重新被打开后,又报错,于是修改为(!DOCTYPE部分删掉):



1 <webapp xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">


其实你可以到http://java.sun.com/dtd/上面去看看(现在已经跳抓到了oracle java的页面)里面根本没有web-app_4_0.dtd,最高版本为2.3,导致Dyanmaic Web module最高版本只能配置到2.3;所以dtd的格式是无法满足Java Server Factes的要求;于是需要改dtd声明为xsd的声明。


然后在工程右键,然后在Project Facts的页面取消勾选Dynamic Web Module;然后更新工程,问题解决了。其实你回到Project Facts里面看到Dynamic Web Module又从新勾选上了,只不过版本成为了3.1;可以看出来eclipse的这个wst组件处理逻辑就是从web.xml文件中读取定义的web-app版本(因为Dynamic Web Module是web的模板,所以读web.xml);然后设置对应的版本号,当发现自身最高版本是3.1(我用的是Neon.1a Release (4.6.1),貌似最高就是3.1)于是设置为了最高版本。


之前报错的原因就是因为需要2.5以上版本的Dynamic Web Module(推测是因为maven的web模板要求的);但是因为web.xml里面的DTD限制了web app的版本,即限制了Dynamic Web Module的版本;于是爆了那个错误;提高了web.xml的版本之后,在取消勾选就是让wst组件自己再去重置一下该版本。