前述
Javaのサーバーサイド開発で、コードを修正したはずなのに挙動が変わらない…と困った経験はありませんか?
私は最近修正しても挙動が変わらず、先輩や同期に泣きついたところ、原因が「サーバーの再起動」「クリーン」「ビルド」の不足であったことがありました。
知識では、コード修正時に行うもの、とわかっていましたがなぜそれらが必要であるか理解していないと私は忘れてしまうのです…。
なので自分への教訓として今回は「サーバーの再起動」「クリーン」「ビルド」は何のために行うのか書きたいと思います!
ビルドとクリーンってそもそも何?
必要な操作 | 目的 |
---|---|
ビルド (Build) | Javaソースコード(.java )を、実行可能なクラスファイル(.class )に変換する |
クリーン (Clean) | 以前のビルドで生成された古いクラスファイルや一時ファイルを削除する |
ビルドはなぜ必要なのか?
サーバーが実際に実行するのは.class
ファイルです。
(詳しくは以下がわかりやすかったです)
.java
ファイルを修正しただけでは、サーバーはそれを理解できません。ビルドを忘れずに実行しなければ、コードの変更は物理的にサーバーにデプロイされません。
つまりビルドをすることでただのコードだったものが動くようになるのです!
クリーンはなぜ必要なのか?
インクリメンタルビルド(差分ビルド)機能を持つIDEやビルドツールは、修正したファイルのみをコンパイルしようとします。しかし、依存関係の複雑さやツールの誤動作により、本来置き換えられるべき古い.class
ファイルが残存してしまうことがあります。
なので上記のクリーン&ビルドを徹底することで、環境をリフレッシュし、予期せぬ古いクラスの実行を防ぐことができます!
サーバー再起動が不可欠な3つの理由
サーバーの再起動は、修正されたコードや設定をメモリに正しくロードし直すための最も重要なステップです。
1. クラスローディングClass Loading
の壁
Javaアプリケーションサーバー(Tomcat、WebLogic、JBossなど)は、高いパフォーマンスを維持するために、起動時に必要なすべてのJavaクラス(.class
ファイル)をメモリに読み込みます。これをクラスローディングと呼びます。
実行中にソースコード(.java
)を修正し、再ビルドして新しい.class
ファイルを生成したとしても、サーバーは既にメモリ上にロードされている古いバージョンのクラスを使用し続けます。ファイルシステム上の変更(新しい.class
ファイル)を自動的には検知しません。
よってサーバーを再起動することで、実行環境(JVM)が終了し、メモリ上の古いクラス情報がすべて破棄されるので、次に再起動した際、修正された新しい.class
ファイルが改めてメモリにロードされ、コード変更が反映されます。
2. マッピング設定のキャッシュ参照
多くのエンタープライズアプリケーションでは、アクションIDとそれを処理するクラス名のような重要なマッピング情報を、起動時のパフォーマンスを向上させるためにデータベースなどから読み込み、アプリケーションのメモリ内にキャッシュします。
もしアクションIDとクラス名の紐づけをデータベース側で修正したとしても、実行中のサーバーは、DBではなくメモリ内の古いキャッシュを参照し続けます。
再起動によって、サーバーはDBや設定ファイルに再度アクセスし、最新のマッピング情報を読み込み直してキャッシュを更新します。これにより、正しいクラスが実行されるようになります。
3. 設定ファイル変更の未反映
コードのロジックだけでなく、エラーの原因が設定ファイルの変更にある場合も再起動が必要です。
===
例
・web.xml
(サーブレットコンテナの設定)
・フレームワーク固有の設定ファイル(SpringのXML/Java Configなど)
・プロパティファイルなど
===
上記のファイルはサーバーが起動する際に一度だけ読み込まれます。実行中にファイルを修正しても、サーバーは古い設定で動作し続けます。
再起動することで、サーバーはこれらの設定ファイルを改めて読み込み、変更が適用されます。
まとめ
コードのロジック、設定、またはマッピングのいずれかをサーバー側で変更した場合は、その変更を確実に実行中の環境に反映させるために、以下の手順を徹底しましょう
1.ソースコード修正
2.クリーン:古い生成物を削除
3.ビルド:最新の.class
ファイルを生成
4.サーバー再起動:メモリ上の古いクラス・キャッシュを破棄し、新しい.class
と設定を読み込み直す
これらの手順を踏むことで、Javaアプリケーションサーバー開発における「コードを直したのに動かない」というトラブルの多くを防ぐことができます。安全で確実な開発のために、ぜひともに習慣づけていきましょう!^^