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>
最初は(のJava EE 7 APIの唯一javax.faces.*
一部)JSF 2.2 APIを表しています。それをすべて削除します。 JSF 2.3の依存関係にはすでに独自のセットがあります。
JSF 2.2、Servlet 3.1、EL 3.0、CDI 1.1、JAX-RS 1.0、JSONP 1.0などを含む2番目はthe entire Java EE 7 APIです。これはwebappのランタイムクラスパスでは最終的に終わることはありません。これはすでにターゲットランタイムによって提供されているはずです。それをprovided
にする必要があります。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
あなたはベアボーンなどのTomcat 8.0、唯一の船JSP 2.3、サーブレット3.1、EL 3.0としてservletcontainerとボックスアウトWebSocketを1.1をターゲットと実際のJava EEサーバの代わりにしているとき、これは実際に誤解されます。 Java EE 7 API全体ではなく、すべてを個別に指定する必要があります。それ以外の場合、誤ってJSF、JSTL、CDIなどのTomcatが提供していないJava EE 7 APIの一部を誤ってインポート/使用しないようなコードを書く際には注意が必要です。 webappと共に(あなたがすでにいくつかの部品のために行ったように)。
ランタイムクラスパスが複数の異なるバージョンのJSFライブラリで汚染されている場合に起こります。ちょうど他のバージョンを取り除く。 – BalusC
私はPOMファイルのmaven依存関係を変更しました:http://pastebin.com/P4ZJYm5vたぶんtomcatのlibフォルダのjarファイルをアップグレードする必要がありますか? –