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 版本。
根据您的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(它只是javax.faces.*
Java EE 7 API 的一部分)。完全删除它。JSF 2.3 依赖项已经有了自己的集合。
第二个代表整个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>
如果您不是针对准系统 servlet 容器(例如 Tomcat 8.0)的真正 Java EE 服务器,这实际上是一种误导,它只提供 JSP 2.3、Servlet 3.1、EL 3.0 和 WebSockets 1.1。您应该单独指定它们而不是整个 Java EE 7 API。否则,您在编写代码时必须小心,以免意外导入/使用 Java EE 7 API 的某些部分,这些部分实际上不是 Tomcat 提供的,例如 JSF、JSTL、CDI 等。然后您需要显式提供它们与 webapp 一起(正如您已经为某些部分所做的那样)。