プチIT化

warファイルが古いまま動く!修正が反映されない時の対処法

こんにちは、わたあめです。プログラムを修正して、warファイルをエクスポート、そしてデプロイ(tomcatに配置)と、いつもの流れで修正・更新作業を行いましたが…。

わたあめ
わたあめ
修正内容が反映されてない気がする!!

warファイルを更新したはずなのに、修正内容が反映されずに前バージョンで動いているという事に気が付きました。この記事では、warファイルが古いまま動いている場合に、わたあめが対処したかをまとめています。

それでは、いってみましょう!

事象

今回、Eclipseでプログラムおよび関連ファイルを修正、その後warファイルをエクスポートし、デプロイ(tomcatの所定の位置に配置)しました。ですが、想定と違って以下の動きになりました。

  • 更新したにも関わらず、修正内容が反映されない修正前のロジックで動いている模様。
  • server.xmlのunpackWARsの設定値はtrueとなっており、warが自動展開される設定となっている。
  • 同じ手順で今までは問題なく更新できていた。

原因

warファイルは新しいものに入れ替わっているが、warファイルの展開先フォルダが古いまま、ということが原因でした。通常、unpackWARsの設定がtrueであれば、warファイルを配置後、tomcatの方で自動で展開されます。何がきっかけで、自動展開されなくなったかは突き止められておりませんが、詳しく原因をみていきましょう。

warファイルの動きをおさらい

warファイルとは、拡張子が”.war"になったファイルで、実態はzipファイルです。

拡張子をwarからzipに変更して展開すると、中のフォルダやファイルの構成を見ることができます。

設定にもよりますが、通常はwarファイルを所定の位置にデプロイ(設置)することで、tomcatがwarファイルを自動展開してくれます。warファイルの設置場所は、tomcatフォルダのwebappsというフォルダに配置していることが多いです。※環境によってtomcatフォルダは異なります。

tomcatは展開したファイルを読んでプログラムを動かすという訳です。

unpackWARsがfalseだと展開されず、warファイル本体を直接みるそうです。

warファイル展開後の更新日時を確認する

もし、同じような挙動になっている方がいたら、展開したファイルが古いままかどうかを確認してみましょう。

tomcatによりwarファイルの展開が行われると、フォルダが作成されます。例えば、test_program.warというwarファイルを配置すると、test_programというフォルダが作成され、その中にファイルが展開されています。

展開されて作成されたフォルダの中を確認してみます。作成したプログラムによってフォルダ構成は違いますが、画像の赤枠のようにフォルダやファイルの更新日時を確認します。

ここの日付がwarファイルよりも古ければ、古いバージョンのまま動いている可能性が高いです。

対処法

tomcatを停止後、展開後のフォルダを削除し、tomcatを起動します。詳しい手順は以下です。

手順

  1. tomcatフォルダ>[bin]>[shutdown.bat]をダブルクリック
  2. tomcatフォルダ>[webapps]>war展開後のフォルダをフォルダごと削除
    例)test_program.warが自動展開されて、test_programフォルダが作成されるなら、test_programフォルダを丸ごと削除する。
    万が一のことを考えて、怖い場合はバックアップ(フォルダーを一時的にどこかにコピー)しておくでも良い。
  3. tomcatフォルダ>[bin]>[startup.bat]をダブルクリック

start.bat実行後、自動的に新しいフォルダが作成されます。新しく作成されたフォルダの更新日時は新しくなっているはずです。

わたあめ
わたあめ
わたあめの環境では、これで新バージョンで動作するようになりました!

その他対処法

今回、怖かったので手作業でフォルダ削除する方向にしましたが、tomcatフォルダ>[conf]>server.xmlファイルを以下の通り設定する方法もあるみたいです。

  • confunpackWARs="false"に設定する:展開せずにwarファイルを直接使う

通常は展開したファイルを利用すると思うので、今回はここの設定変更は採用しませんでした。気になる場合は、別途調べてみてくださいね!

さいごに

最後までお読みいただきありがとうございました。この記事が同じ事象で悩んでいる方の解決の糸口になれば幸いです。

それでは、また!

flier(フライヤー)