かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

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 をインストールします。

  1. WinMerge 日本語版 のページの画面上部にある「32bit版ダウンロード」「64bit版ダウンロード」のいずれかのボタンをクリックしてダウンロードします。Windows7 64bit 版を使用しているので 64bit版のファイル ( WinMerge-2.14.0-jp-74-x64-Setup.exe.zip ) をダウンロードしました。
  2. ダウンロードした WinMerge-2.14.0-jp-74-x64-Setup.exe.zip を解凍します。
  3. 解凍して作成された WinMerge-2.14.0+-jp-74-x64-Setup.exe を実行します。
  4. WinMerge セットアップ」画面が表示されます。「次へ」ボタンをクリックします。
  5. 「情報」画面が表示されます。「次へ」ボタンをクリックします。
  6. 「インストール先の指定」画面が表示されます。「次へ」ボタンをクリックします。
  7. コンポーネントの選択」画面が表示されます。「次へ」ボタンをクリックします。
  8. 「プログラムグループの指定」画面が表示されます。「プログラムグループを作成しない」チェックボックスをチェックした後、「次へ」ボタンをクリックします。
  9. 「追加タスクの選択」画面が表示されます。画面上のチェックボックスのチェックを全て外した状態にした後、「次へ」ボタンをクリックします。
  10. 「インストール準備完了」画面が表示されます。「インストール」ボタンをクリックします。
  11. 「インストール状況」画面が表示され、インストールが実行されます。
  12. インストールが完了すると「情報」画面が表示されます。「次へ」ボタンをクリックします。
  13. WinMerge セットアップウィザードの完了」画面が表示されます。「完了」ボタンをクリックします。

classes ディレクトリの比較

WinMerge が実行されますので ( 「WinMerge セットアップウィザードの完了」画面で「WinMergeを起動する」チェックボックスがチェックされているため ) 、c:\work の下の 01_classes_build, 02_classes_make の各ディレクトリを WinMerge 上にドラッグ&ドロップします。ドロップ後ダイアログが表示されますので、画面下部の「サブフォルダを含む」チェックボックスをチェックします。

f:id:ksby:20150321175444p:plain

上記の画像の状態のダイアログで「OK」ボタンをクリックします。差分があり、以下の画像の画面が表示されました。

f:id:ksby:20150321175717p:plain

同一項目は非表示にしたいので、WinMerge のメインメニューから「表示」-「同一項目の表示」を選択し、チェックを外します。以下の画像の画面が表示されます。

f:id:ksby:20150321180102p:plain

右側のみ、つまり 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 existconstant.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 でその中を見てみます。

f:id:ksby:20150321181201p:plain

直下に 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 タスク実行という方が現実的なのでしょうか。