2016-04-05 2 views
1

Я попытался запустить Tomcat с JSF 2.3.0-M05, но я получаю ошибкуНе удается запустить Tomcat 8 с JSF 2.3: java.lang.NoSuchMethodError: javax.faces.view.facelets.FaceletCache.setCacheFactories

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

есть ли решение или это известная проблема?

+0

Это может произойти, если пул классов среды выполнения загрязнен несколькими различными версиями JSF-библиотек. Просто избавьтесь от других версий. – BalusC

+0

Я только изменил зависимость maven в файле POM: http://pastebin.com/P4ZJYm5v Возможно, мне нужно обновить файл jar в папке lib tomcat? –

ответ

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. Таким образом, эта проблема предполагает, что у вас есть более ранняя версия API JSF в пути к среде выполнения.

На основе 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 (который является только javax.faces.* частью Java EE 7 API). Удалите его вообще. У зависимостей 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 ориентации на баребоны servletcontainer, такие как 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 и т. Д. Затем вам необходимо явно предоставить их наряду с webapp (как вы уже делали для некоторых частей).