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 一起显式提供(正如您已经对某些部分所做的那样)。
我尝试使用 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 一起显式提供(正如您已经对某些部分所做的那样)。