Multi Vitamin & Mineral

Multi Vitamin & Mineral です。プログラムに関することを書いております。

Spring Boot をはじめてみるよ(Maven コマンド編)

multimineral-tech.com

上記では、 STS の GUI でプロジェクトを作りました。

GUI が裏でヨロシクやってくれていたのですが、何が行われていたのか分からないと、何かを変えたい時にどこを修正すればよいのかも分かりません。

そこで、 GUI を使わずに作成する方法を確認してみましょう。

下準備

  • jdk のインストール
  • Maven のインストール
  • STS(Spring Tool Suite)のインストール

を行います。ここでは、 Maven のインストールだけ触れておきます。

ちなみに、なんで Gradle じゃなくて Maven なの? と言われてしまうかもですが、 Maven には後述する archetype:generate というのがあるので、最初の敷居が低くなるから(説明が若干省けるから)です。 Gradle を使いたい人は、 Gradle で試してみてください。

Maven の導入

Windows の場合

公式サイトからダウンロードして入れておけばOK!

Maven – Welcome to Apache Maven

PATH を通して cmd.exe から mvn コマンドが使えるようにしておきます。

Mac の場合

homebrew を入れている前提ですが、 brew コマンドでインストールできます。

$ brew update        # 一応 formula を更新しておいてから、
$ brew install maven # Maven をインストールします。

インストールの確認

mvn --version で、バージョン情報が表示されればOK。

$ mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.2", arch: "x86_64", family: "mac"

Spring Boot プロジェクト作成

空の Maven プロジェクトから作る

mvn コマンドで空のプロジェクトを作ることができます。

$ mvn -B archetype:generate -DgroupId=edu.self -DartifactId=my_first_spring_boot -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart
$ cd my_first_spring_boot/

-B は 「Run in non-interactive (batch) mode」という意味です。コマンド実行時に「パッケージは edu.self でいい?」といった質問をされずに済みます。それだけです。

archetypeArtifactId はどんなスケルトンを作るかを指定します。 maven-archetype-quickstart を指定すると、世間的にデファクトとなっている、ちょうどいい感じの空の Maven プロジェクトが作成されます。(他にも色々ありますが、まあ、使わんです。)

ここで指定した引数は以下のようになります。

パラメータ 引数 意味
groupId edu.self プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。
artifactId my_first_spring_boot プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。
version 1.0.0-SNAPSHOT プロジェクトのバージョン。
archetypeArtifactId maven-archetype-quickstart 作成するスケルトンの種類。

STS の利用

Maven で作成したプロジェクトを STS にインポート

STS.app を起動します。

次に、Maven で作成したプロジェクトを STS にインポートします。

[File] > [Import] > [Maven] > [Existing Maven Projects]

で、作成したプロジェクトを指定します。

以降、STS を使って作業をします。

これで各種インストールはおしまいです。

プロジェクトの設定変更

自動で作られたプロジェクトは Spring のプロジェクトではないので、「Spring を使うよ!」という設定にしてみましょう。

pom.xml の編集して Spring の利用を宣言

プロジェクトには、pom.xml と App.java (とそのテスト)だけ作成されています。

pom.xml は Maven プロジェクトの設定ファイルです。 pom.xml に Spring Boot を利用するよう変更します。 以下の【追加】、【削除】とコメントのある部分のみ変更を加えています。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>edu.self</groupId>
  <artifactId>my_first_spring_boot</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>my_first_spring_boot</name>
  <url>http://maven.apache.org</url>
  <!-- Spring Boot の利用を宣言し、バージョンを指定【追加】 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.1.RELEASE</version>
  </parent>
  <dependencies>
    <!-- Spring Boot の Web アプリケーションライブラリの利用を指定【追加】 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot の ユニットテストライブラリの利用を指定【追加】 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
<!-- JUnitの指定を削除(Spring Boot に同梱されているため)【削除】
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
 -->
  </dependencies>
  <build>
    <plugins>
      <!-- Spring Boot の ビルド用 Maven プラグイン【追加】 -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <properties>
    <!-- Java バージョン指定【追加】 -->
    <java.version>1.8</java.version>
  </properties>
</project>

Spring Boot 関連では以下の3つの依存パッケージを追加しました。 これでこのプロジェクトで利用する各種ライブラリを Web 経由で取得できるようになります。 なお、spring-boot-starter-parent は必須です。

  • Spring Boot の基本パッケージ(spring-boot-starter-parent)これをベースに web や batch などを追加していきます。
  • Spring Boot の Web 基本パッケージ(spring-boot-starter-web
  • Spring Boot の UnitTest の基本パッケージ(spring-boot-starter-test

あとは、Maven で Spring Boot を扱えるようにするためのプラグイン spring-boot-maven-plugin と、 Java8 を使うという指定の2つを入れています。

さて、今、 STS 上ではエラー表示が出ているのではないかと思います。 pom.xml の設定変更を STS が認識していないからです。反映させてあげましょう。

プロジェクトを右クリック > Maven > Update Project...

これでエラー表示が消えたはずです。

利用ライブラリの確認

Spring Boot に「お任せでいい感じのライブラリを入れといて!」という指示をしました。 実際にどのようなライブラリが使われるのか、確認してみましょう。

$ mvn dependency:tree

使われるライブラリの一覧がツリー状に表示されます。

もちろん STS の Package Explorer でも見ることができます。

簡単な Web アプリで 「Hello Spring Boot!」

今回、 spring-boot-starter-web を入れたので、ブラウザで表示できることを確かめましょう。

簡単な Web アプリの作成

すでに App.java がエントリーポイントとして存在しますので、これを編集して使ってみましょう。

@RestController // Webアプリのリクエストを受け付けるクラスであることの指定
@EnableAutoConfiguration // 様々な設定を自動的に有効化
public class App {
    @RequestMapping("/") // URLのパスの指定
    public String index() {
        return "Hello Spring Boot!";
    }

    public static void main(String[] args) {
      // Spring Bootによるアプリケーションを起動するための処理です。
      SpringApplication.run(App.class, args);
    }
}

はい、こんだけです。

コンソールからの起動

Maven で Spring Boot を起動します。裏で Tomcat が起動することになります。

$ mvn spring-boot:run

http://localhost:8080/ にアクセスして「Hello Spring Boot!」と表示されればOKです。

Ctrl + c で、Tomcat を Stop しておきましょう。

STSからの起動

App.java を右クリックして「Spring Boot App」の実行をしてもOK。これでも Tomcat が起動します。

[Run As] > [Spring Boot App]

どちらでも、好きな方法で起動しましょう。

実行可能な jar を作って配布

GUI から実行もできるのですが、コマンドを打って実行することで、 GUI で行われていることが何であったのか確認しておきましょう。

jar の作成と実行

作成は簡単。以下のコマンドで、 ./target フォルダに jar ファイルが作成されます。

$ mvn packege

起動は jar を実行するだけです。 Tomcat が立ち上がります。

$ java -jar target/my_first_spring_boot-1.0.0-SNAPSHOT.jar

http://localhost:8080/ にアクセスして「Hello Spring Boot!」と表示されればOKです。

war ファイルで運用するのは大変?

と、タイトルに書きましたが、簡単にはできません。 Spring Boot は jar で運用することを前提としているようですので、この変更はちょっと面倒です。

ただ、 GUI から war をターゲットにしたプロジェクトを自動生成することができます。 これまでの説明で作成したプロジェクトと比較すれば、どういう仕組にすれば良いのか自ずと見えてくると思います。

Tomcat や他の AP サーバーがすでに存在しているところにアプリケーションを提供することは多々あると思います。 そういう場合はこの対応が必要になってきますので、ちょっと頑張ってやってみましょう。

おわりに

以上です。

そこそこちゃんとした Web アプリを作るお話はまた別の機会に!