JSF jarを作ってtomcatで動かそうとするとClassNotFoundException

JSF jarを作ってtomcatで動かそうとするとClassNotFoundException

#JSF jarを作ってtomcatで動かそうとするとClassNotFoundExceptionが出て動かない場合の対処法

## 環境
os : redhat
java : Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
jsf：2.2.6
tomcat：7.0.56

## 現象
JSFアプリケーションのjarを作ってtomcatにデプロイして動かそうと思った時、何故か上手く動かないeclipse上だと動いているのにっ！
　結構長い事ハマった事があります。調べていくと
 
 + tomcatは起動する
 + tomcat関連のログにはエラーは出ていない
 + アプリで出しているログにClassNotFoundExceptionがでてちゃんと動かない

StackTraceは以下の内容が出ています。


```
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
        at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:344)
        at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:153)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at xx.xx.xxxx.xxxxx.common.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:166)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
```

## 原因
Google先生に色んな質問をすると、色々教えてくれるのですが全部外人さんの記事ばかり…英語苦手なんです読めないんです。
がしょうがないので何とか読んで色々試してみても一向に改善しませんでした。

でも
そんな時、あるナイスガイがこんな事をいっていました。「META-INFに空の faces-config.xmlを置いてjarにすれば治るYo」
※サイトのURL忘れちゃった、Googleで調べても見つけられなかったから割愛します。
※ faces-config.xml ・・・JSF周りの各種設定を書くxml

どうやら、JSFアプリケーションでjarを作る際は、実際に設定を書く faces-config.xmlとは別に（META-INFに本体あれば動くのかも・・・でも試してない）
空の faces-config.xmlを作成してMETA-INFに置かないといけないらしい

## 対応方法

### さっそく↓↓の感じの faces-config.xmlを作ります。(改行コードはlfのみ)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
    version="2.1">
</faces-config>

```

### jarのMETA-INFにいれる
jarファイルを解凍して、META-INFにさっき作ったfaces-config.xmlをコピーして、またjarにします。


### うごいたーーーー！

## あとがき
多分、本当は別の適切な対処方法があるのかもしれない。と思いつつも調査はこれでギブアップ
何とか動いてくれています。

後、面倒臭かったのがeclipseで開発しているのですが、開発中からMETA-INFに空のfaces-config.xmlを置いちゃうと
eclipse上でJSFが動きません、だからjarを作る時に毎回やっていました。（面倒臭い）

mavenで自動デプロイしてくれた人に感謝しつつ

あと、jar内に日本語ファイルがあると、また別のエラーで動かなくなります。お気を付け