yanom blog

様々な技術について書きます

log4j2を使うときにハマった

はじめに

最近Javaのアプリを作っています。
そのアプリ内でログ出力部分を作っていて、log4j2のライブラリを使おうとした際に少しハマったので、記事にしておきます。

エラー内容

gradleで依存関係を追加し、アプリを実行した際以下のようなエラーが発生しました。

ERROR StatusLogger Caught java.lang.AbstractMethodError setting feature http://xml.org/sax/features/external-general-entities to false on DocumentBuilderFactory org.apache.xerces.jaxp.DocumentBuilderFactoryImpl@2d3379b4: java.lang.AbstractMethodError: Receiver class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl does not define or inherit an implementation of the resolved method abstract setFeature(Ljava/lang/String;Z)V of abstract class javax.xml.parsers.DocumentBuilderFactory.
 java.lang.AbstractMethodError: Receiver class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl does not define or inherit an implementation of the resolved method abstract setFeature(Ljava/lang/String;Z)V of abstract class javax.xml.parsers.DocumentBuilderFactory.

エラー箇所としては、
private static final Logger _log = LogManager.getLogger(App.class);
みたいなところで特に問題なさそうなのになぜ・・・。

解決方法

以下stackoverflowに解決方法がありました。
ERROR StatusLogger Caught java.lang.AbstractMethodError

どうも、xercesというライブラリが入っていないため出ているエラーのようです。
(依存関係にあるライブラリは全部落ちてくると思っていたんですが・・・。謎です。)

以下のようにxercesライブラリを追加したところエラーは解消されました。

compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
compile group: 'xerces', name: 'xercesImpl', version: '2.11.0 //これを追加

まとめ

これで心置きなくlog4j2を使うことが出来ます。
stackoverflowは偉大ですが、このままだと応用が効かないので、なぜ依存関係ファイルが一緒に落ちてこなかったは後ほど調べておきます。