javax.servlet.UnavailableException: In a Servlet 3.0+ application, you must not define a log4jServletFilter in web.xml. Log4j 2 defines this for you automatically.

Tomcat7に、古いWebアプリをデプロイしたら、log4jにまつわるエラーにより、WEBアプリが立ち上がらない問題に遭遇しました。

Tomcatのログを見ると、以下のようなエラーが出ていました。

SEVERE: Error during ServletContainerInitializer processing
javax.servlet.UnavailableException: In a Servlet 3.0+ application, you must not define a log4jServletFilter in web.xml. Log4j 2 defines this for you automatically.

Servlet 3.0以降では、log4jServletFilterをweb.xmlの中に定義してはいけないそうです。

web.xmlから以下を削除しました。

        <!-- log4j.xmlのファイルパス -->
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>file:///PATH/TO/log4j2.xml</param-value>
    </context-param>

    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.core.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

    <!-- 起動・停止リスナー -->
    <listener>
        <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class>
    </listener>

そして、log4j2.xmlを、クラスパスが通ったディレクトリ、つまり、classファイル(Javaファイル)が配置されているディレクトリに移しました。

About DDD Structure

アプリケーションのアーキテクチャの勉強のため、githubに、随時、まとめていこうと思いました。

DDDは、概念が難しく、実装に落とし込むことが難しいです。

それゆえ、忌避される傾向もあるように感じます。

たしかに、現場では、クラスをどうつくっていくか、明確でわかりやすい基準を求められますから、それもわかります。

なにかバランスを取った形はないものかと思います。


gistcef516f482bb73b2a58f087954cb9de1