1

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

有什么解决方案还是这是一个已知问题?

4

1 回答 1

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 版本。

根据您的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 一起(正如您已经为某些部分所做的那样)。

于 2016-04-05T19:02:39.973 回答