无法使用JSF 2.3启动Tomcat 8:java.lang.NoSuchMethodError:javax.faces.view.facelets.FaceletCache.setCacheFactories

时间:2016-04-05 18:35:59

标签: maven jsf tomcat8 nosuchmethoderror jsf-2.3

我尝试使用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

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

1 个答案:

答案 0 :(得分:3)

  

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的运行时类路径中。这个应该由目标运行时提供。您需要将其标记为provided

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

这实际上是误导性的,而不是真正的Java EE服务器,而是针对像Tomcat 8.0这样只能运行JSP 2.3,Servlet 3.1,EL 3.0和WebSockets 1.1的准系统servlet容器。您应该单独指定它们而不是整个Java EE 7 API。否则,在编写代码时必须小心,不要意外导入/使用Tomcat实际上不提供的Java EE 7 API的某些部分,例如JSF,JSTL,CDI等。然后您需要明确地将它们与webapp一起提供(正如您已经为某些部分所做的那样)。