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で出力するログ
- localhost.log
- catalina.log
などが出力されなくなってしまった。
しばらくググってみた結果、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は読む方が良さそうという話。