Cannot start Tomcat 8 with JSF 2.3: java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories

Cannot start Tomcat 8 with JSF 2.3: java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories

我尝试使用 JSF 2.3.0-m05 运行 Tomcat,但出现错误

java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories(Ljavax/faces/view/facelets/FaceletCache$MemberFactory;Ljavax/faces/view/facelets/FaceletCache$MemberFactory;)V

完整日志文件:http://pastebin.com/UkhQ3L5D
Maven pom.xml: http://pastebin.com/P4ZJYm5v

是否有任何解决方案或者这是一个已知问题?

java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories(Ljavax/faces/view/facelets/FaceletCache$MemberFactory;Ljavax/faces/view/facelets/FaceletCache$MemberFactory;)V

此方法是自 JSF 2.3 以来的新方法。因此,这个问题表明您在运行时类路径中有一个较旧的 JSF API 版本。

基于your pom.xml,以下依赖项存在冲突:

<dependency>
    <groupId>javax.faces</groupId>
    <artifactId>javax.faces-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
</dependency>

第一个代表 JSF 2.2 API(它只是 Java EE 7 API 的 javax.faces.* 部分)。完全删除它。 JSF 2.3 依赖项已经有了自己的集合。

第二个代表the entire Java EE 7 API,包括JSF 2.2、Servlet 3.1、EL 3.0、CDI 1.1、JAX-RS 1.0、JSONP 1.0等,这个绝对不会出现在webapp的runtime classpath中。这个应该已经由目标运行时提供了。你需要标记它provided.

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

当您不是针对准系统 servletcontainer(例如 Tomcat 8.0,它只提供 JSP 2.3、Servlet 3.1、开箱即用的 EL 3.0 和 WebSockets 1.1。您应该单独指定它们,而不是整个 Java EE 7 API。否则,在编写代码时必须小心,不要意外 import/use Java EE 7 API 的某些部分 Tomcat 实际上没有提供,例如 JSF、JSTL 、CDI 等。然后您需要将它们与 webapp 一起显式提供(正如您已经对某些部分所做的那样)。