Не удается запустить Tomcat 8 с помощью JSF 2.3: java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories

Я пытался запустить Tomcat с JSF 2.3.0-m05, но получаю ошибку

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 ответ

Решение

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 в classpath времени выполнения.

На основании вашего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>

Первый представляет API JSF 2.2 (который является только javax.faces.* часть Java EE 7 API). Удалите это вообще. Зависимость JSF 2.3 уже имеет свой собственный набор.

Второй представляет весь API Java EE 7, включая JSF 2.2, Servlet 3.1, EL 3.0, CDI 1.1, JAX-RS 1.0, JSONP 1.0 и т. Д. Этот код может полностью не оказаться в пути к классам во время выполнения веб-приложения. Предполагается, что этот уже обеспечен целевой средой выполнения. Вы должны отметить это 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 из коробки. Вы должны указывать их все по отдельности вместо всего API Java EE 7. В противном случае вы должны быть осторожны при написании кода, чтобы случайно не импортировать / не использовать некоторые части Java EE 7 API, которые фактически не предоставляются Tomcat, такие как JSF, JSTL, CDI и т. Д. Затем вам нужно было бы явно предоставить их вместе с веб-приложением (как вы уже сделали для некоторых частей).

Другие вопросы по тегам