Gradle の clean タスク → build タスク実行後に IntelliJ IDEA からのテストが成功しない理由とは?
Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その20 )( 登録画面作成5 ) で、「clean タスク → build タスク実行後に「Run '.....' with Coverage」を実行するとエラーになるのですが、「Build」-「Make Project」(Ctrl+F9) のコンパイルと、Gradle の build タスクのコンパイルは結果が異なるのでしょうか?」と書きましたが、今回はその原因を調査します。
生成される classes ディレクトリの比較
classes ディレクトリコピー用ディレクトリの作成
C:\work ディレクトリを作成します。ここに作成した classes ディレクトリをコピーします。
build タスク実行後の classes ディレクトリのコピー
最初に clean タスク → build タスクを実行します。実行後、C:\project-springboot\ksbysample-webapp-basic\build の下の classes ディレクトリを c:\work の下にコピーした後、ディレクトリ名を classes → 01_classes_build へ変更します。
IntelliJ IDEA の「Rebuild Project」メニュー実行後の classes ディレクトリのコピー
次に clean タスクを実行した後、IntelliJ IDEA のメインメニューから「Build」-「Rebuild Project」を選択します。選択後、C:\project-springboot\ksbysample-webapp-basic\build の下の classes ディレクトリを c:\work の下にコピーした後、ディレクトリ名を classes → 02_classes_make へ変更します。
WinMerge のインストール
2つのディレクトリを比較したいので、WinMerge をインストールします。
- WinMerge 日本語版 のページの画面上部にある「32bit版ダウンロード」「64bit版ダウンロード」のいずれかのボタンをクリックしてダウンロードします。Windows7 64bit 版を使用しているので 64bit版のファイル ( WinMerge-2.14.0-jp-74-x64-Setup.exe.zip ) をダウンロードしました。
- ダウンロードした WinMerge-2.14.0-jp-74-x64-Setup.exe.zip を解凍します。
- 解凍して作成された WinMerge-2.14.0+-jp-74-x64-Setup.exe を実行します。
- 「WinMerge セットアップ」画面が表示されます。「次へ」ボタンをクリックします。
- 「情報」画面が表示されます。「次へ」ボタンをクリックします。
- 「インストール先の指定」画面が表示されます。「次へ」ボタンをクリックします。
- 「コンポーネントの選択」画面が表示されます。「次へ」ボタンをクリックします。
- 「プログラムグループの指定」画面が表示されます。「プログラムグループを作成しない」チェックボックスをチェックした後、「次へ」ボタンをクリックします。
- 「追加タスクの選択」画面が表示されます。画面上のチェックボックスのチェックを全て外した状態にした後、「次へ」ボタンをクリックします。
- 「インストール準備完了」画面が表示されます。「インストール」ボタンをクリックします。
- 「インストール状況」画面が表示され、インストールが実行されます。
- インストールが完了すると「情報」画面が表示されます。「次へ」ボタンをクリックします。
- 「WinMerge セットアップウィザードの完了」画面が表示されます。「完了」ボタンをクリックします。
classes ディレクトリの比較
WinMerge が実行されますので ( 「WinMerge セットアップウィザードの完了」画面で「WinMergeを起動する」チェックボックスがチェックされているため ) 、c:\work の下の 01_classes_build, 02_classes_make の各ディレクトリを WinMerge 上にドラッグ&ドロップします。ドロップ後ダイアログが表示されますので、画面下部の「サブフォルダを含む」チェックボックスをチェックします。
上記の画像の状態のダイアログで「OK」ボタンをクリックします。差分があり、以下の画像の画面が表示されました。
同一項目は非表示にしたいので、WinMerge のメインメニューから「表示」-「同一項目の表示」を選択し、チェックを外します。以下の画像の画面が表示されます。
右側のみ、つまり 02_classes_make ( IntelliJ IDEA のメインメニューから「Build」-「Rebuild Project」を選択した方 ) の方にしか properties ファイル等が存在しませんでした。
テスト失敗時のログには Caused by: java.io.FileNotFoundException: class path resource [constant.properties] cannot be opened because it does not exist
と constant.properties
が存在しないと出ていましたので、確かにその通りでした。
jar ファイル生成後の中身の確認
build タスクで properties ファイル等が build ディレクトリにコピーされないということは、まさか jar ファイルを作成した時も jar ファイルの中に properties ファイル等が格納されていないのか?と思い、確認してみます。
clean タスク → build タスクを実行します。実行後、C:\project-springboot\ksbysample-webapp-basic\build\libs の下に ksbysample-webapp-basic-0.0.1-SNAPSHOT.jar が作成されていますので、拡張子を .jar → .zip へ変更した後 Explorer でその中を見てみます。
直下に properties ファイル等が格納されていました。問題ないですね。
調査結果
- 原因は build タスク実行時には src/main/resources ディレクトリの下のファイルが build ディレクトリの下にコピーされないためでした。
- 「Run '.....' with Coverage」等 IntelliJ IDEA のメニューからテストを実行する時は必ず IntelliJ IDEA の「Build」-「Make Project」(Ctrl+F9) か「Build」-「Rebuild Project」でコンパイルするようにしましょう。
- clean タスクを使用しなければよいだけなのかもしれません ( IntelliJ IDEA がコンパイルが必要なものは適切に判断してくれる気がします ) 。
- と思いましたが、多人数で開発していて merge する場合には build フォルダに不要な class ファイルが残ることを懸念して clean タスク → 「Rebuild Project」でコンパイル → build タスク実行という方が現実的なのでしょうか。