My Note Pad

エンジニアリングや日々の雑感を書いていきます

JRebelを7.0.1にするとtomcatのログが出ない

環境

何が起こったのか

JRebelのバージョンを7.0.1にするとtomcat起動時に以下のエラーが出てしまって、

12月 13 12:25:34 localhost.localdomain server[8602]: Exception in thread "AsyncFileHandlerWriter-400136488" 13-Dec-2016 12:25:34.243 WARNING [main] org.apache.tomcat
12月 13 12:25:34 localhost.localdomain server[8602]: java.lang.NoSuchMethodError: org.apache.juli.AsyncFileHandler._jr$ig$closed(Ljava/lang/Object;)Z
12月 13 12:25:34 localhost.localdomain server[8602]: at org.apache.juli.AsyncFileHandler$LogEntry.flush(AsyncFileHandler.java:166)
12月 13 12:25:34 localhost.localdomain server[8602]: at org.apache.juli.AsyncFileHandler$LoggerThread.run(AsyncFileHandler.java:146)

logging.propertiesで設定している、AsyncFileHandlerWriterで出力するログ

などが出力されなくなってしまった。

しばらくググってみた結果、JRebelのフォーラムで同様の事象が上がっているのを見つけることができた。

Topic: Jrebel 7.0.1 Tomcat logging problem | zeroturnaround.com

というわけで、JRebelのバージョンを7.0.0に戻すことで解消。

そもそも何故JRebelのバージョンを上げたか

Vagrantをプロビジョニングしなおしたら勝手に上がったという話。

Chefのレシピの中で、JRebelをインストールする部分があり、remote_fileの指定で
http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip
が定義されていた。

つまりプロビジョニングすると毎回最新版が落とされてくるようになっていたため、たまたま自分が今回の地雷を踏む事に。
自分でJRebelのバージョンを意図的に上げたわけではないので、原因の特定に時間がかかってしまったのは言うまでもない

有識者曰く、IntelliJのJRebelプラグインのバージョンが頻繁に上がるため、それに追従するためにレシピも最新を取得するようにしていたとの事。

一旦はremote_fileを以下のようにバージョン指定することで回避
https://dl.zeroturnaround.com/jrebel/releases/jrebel-7.0.0-nosetup.zip
※このURLがなかなか見つからず、更に時間がかかってしまった。

本来は社内のリポジトリなどに置いてそこから取得するべきなのだろう・・
じゃないと絶対また誰かが地雷を踏む・・

JRebel 7.0.0に上げたときにもハマった

今回の前にもJRebel 6.5(だったかな?)から7.0.0に(勝手に)上がったときにも一度ハマっている。
その際はtomcat自体が起動しなくなった。
エラーログが分かりやすかったのですぐに気づいたので良かったけど・・

ChangeLogにあるようにJRebelエージェントの指定の方法が6.x系から変更になっている。
JRebel agent upgrade | zeroturnaround.com

tomcatを起動する際のJVMの引数で
-javaagent:{JREBEL_HOME}/jrebel.jar
としていたものを
-agentpath:{JREBEL_HOME}/lib/libjrebel64.so
と指定しなおしてやることで問題なく動き出した。

libjrebel64.soを指定している部分は、OSによって変わるので以下のページを参照して指定してやればok

JRebel Agent (recommended) — JRebel 7.x documentation

JRebelは便利だけどアップデートの度にハマることが多いので、ちゃんとChangeLogは読む方が良さそうという話。