Gradle で Multi-project を作成する ( その3 )( lib+cmdapp編、Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
目次
- Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する
- clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
java -jar sample-cmdapp-1.0.0-RELEASE.jar
コマンドを実行してみる- まとめ
手順
Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成する
IntelliJ IDEA で sample-cmdapp プロジェクトを作成する
IntelliJ IDEA から Spring Initializr を利用して Spring Boot ベースのコマンドラインアプリケーションのプロジェクトを作成します。
※シンプルなコマンドアプリケーションなので何もチェックしません。
作成後 IntelliJ IDEA のウィンドウが開きますが、何もせずに閉じます。
.gitignore に設定を追加する
sample-cmdapp プロジェクトの下に作成された .gitignore から ### STS ###
、### IntelliJ IDEA ###
、### NetBeans ###
、### VS Code ###
の設定をコピーして、ルートディレクトリの .gitignore に追加します。
# Ignore Gradle project-specific cache directory .gradle # Ignore Gradle build output directory build ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr /out/ ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ ### VS Code ### .vscode/
sample-cmdapp プロジェクトから不要なファイルを削除する
D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp\sample-cmdapp\
の下には以下のディレクトリ・ファイルがありますが、
src ディレクトリと build.gradle 以外は不要なので削除します。削除すると以下の状態になります。
settings.gradle に sample-cmdapp プロジェクトの include 文を追加する
D:\project-springboot\ksbysample-boot-miscellaneous\gradle-multiprj-lib-cmdapp
の下の settings.gradle に include 'sample-cmdapp'
を追加します。
rootProject.name = 'gradle-multiprj-lib-cmdapp' include 'sample-lib' include 'sample-cmdapp'
追加後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると :sample-cmdapp
が追加されます。
sample-cmdapp プロジェクトの build.gradle から不要な記述を削除し、sample-lib プロジェクトへの依存関係を追加する
sample-cmdapp プロジェクトの build.gradle を以下の内容に変更します。
plugins { id "org.springframework.boot" version "2.1.4.RELEASE" } dependencyManagement { imports { mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) } } dependencies { implementation("org.springframework.boot:spring-boot-starter") testImplementation("org.springframework.boot:spring-boot-starter-test") implementation project(":sample-lib") }
sample-cmdapp の設定はプロジェクトのルートディレクトリにある build.gradle に project(':sample-cmdapp') { ... }
で記述することも可能ですが、その場合 plugins { ... }
が使えなくなるので sample-cmdapp の下に build.gradle を残してこの中に設定を記述することにします。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
SampleCmdappApplication クラスに CommandLineRunner インターフェースを実装する
sample-cmdapp/src/main/java/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplication.java を以下のように変更します。
package ksbysample.cmdapp.samplecmdapp; import ksbysample.lib.samplelib.StrNumUtils; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SampleCmdappApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(SampleCmdappApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("★★★ " + StrNumUtils.plus("1", "2")); } }
クラスに implements CommandLineRunner
を追加し run メソッドを実装します。run メソッド内で sample-lib プロジェクトの StrNumUtils クラスを呼び出すようにします。
次にテストクラスを作成します。Spring Initializr でプロジェクトを作成したので sample-cmdapp/src/test/java/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplicationTests.java が作成されていますが、このテストはファイル毎削除して Spock で作り直します。
cmdapp/src/test/groovy/ksbysample/cmdapp/samplecmdapp/SampleCmdappApplicationTest.groovy が新規作成されますので、以下の内容を記述します。
package ksbysample.cmdapp.samplecmdapp import spock.lang.Specification class SampleCmdappApplicationTest extends Specification { def "sample-cmdapp を実行すると'★★★ 3'が出力される"() { setup: def buf = new ByteArrayOutputStream(1024) System.out = new PrintStream(buf) when: SampleCmdappApplication.main() then: buf.toString().contains("★★★ 3") } }
ここまでで以下のディレクトリ構成になります。
clean タスク実行 → Rebuild Project 実行 → build タスク実行を行う
clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと、BUILD SUCCESSFUL のメッセージが出力されました。
各プロジェクトの build/libs ディレクトリの下に sample-cmdapp-1.0.0-RELEASE.jar、sample-lib-1.0.0-RELEASE.jar が作成されています。
sample-cmdapp-1.0.0-RELEASE.jar を zip ソフトで開いてみると BOOT-INF/lib の下に sample-lib-1.0.0-RELEASE.jar が入っていることも確認できます。
java -jar sample-cmdapp-1.0.0-RELEASE.jar
コマンドを実行してみる
Multi-project で作成した sample-cmdapp-1.0.0-RELEASE.jar が問題なく動作することをコマンドラインから確認してみます。
コマンドラインから java -jar sample-cmdapp-1.0.0-RELEASE.jar
コマンドを実行すると "★★★ 3" が出力されることが確認できました。
まとめ
- Multi-project ではルートディレクトリの build.gradle の
subprojects { ... }
に共通の設定を記述する。plugin の設定だけplugins { ... }
が使えないのでapply plugin: "..."
で記述すること。 - Spring を使用しないライブラリのサブプロジェクトを作成したい時はサブプロジェクトのディレクトリを作成した後、settings.gradle に
include '<サブプロジェクトのディレクトリ名>'
を書いてから IntelliJ IDEA の Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すればよい(おそらくコマンドだとgradle wrapper
だと思われる)。 - Spring Boot ベースのコマンドラインアプリケーションのサブプロジェクトを作成したい時は Spring Initializr でサブプロジェクトを作成してから src, build.gradle 以外を削除し、settings.gradle に
include '<サブプロジェクトのディレクトリ名>'
を書いてから IntelliJ IDEA の Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すればよい。 - サブプロジェクトの build.gradle の設定はサブプロジェクトのディレクトリの下に build.gradle を置いてその中に記述するか、ルートディレクトリの build.gradle に
project(':<サブプロジェクトのディレクトリ名>') { ... }
の形式で記述する。
Multi-project を初めて作ってみましたが、Gradle Guides の Creating Multi-project Builds に基本は書かれているので、これを読めば何とか作れるものですね。
履歴
2019/04/20
初版発行。