【Java】『SpringBootに入門する為の助走本』のハンズオン02
【結論】
- Qittaに投稿された『SpringBootに入門する為の助走本(以降、助走本と省略)』を読んでハンズオンした内容の備忘録です。
- 今回は、ブラウザに文字列を出力するまでの流れをハンズオンした内容をまとめました。
- 御察しの通り、大した内容では無いです。。
- ブログのネタに困らないように、ステップを刻んでカサ増しする作戦です。
【目次】
取り敢えずStarterProjectを使ってみる編
『助走本』の手順に従って、「Spring スターター・プロジェクト」を作成すると、ぽむぽむ(pom.xml)にてエラーが出てしまいました。
(下図は若干嫌いになりかけているSpringを嫌いにならないための、私なりの対策です。)
ぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽぽむ
— うさまる2号 (@g_fkcb) August 10, 2016
ちょ ほんとやめて
ぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむぽむ#うさまる pic.twitter.com/TUVVEbf4LK
pom.xmlにて「不明」なエラーが発生
下図はその時のキャプター画像と説明です。エラーの原因は、(3)に書かれているバージョンが助走本と異なるからでした。よって、助走本に合わせて2.1.5.RELEASE
から2.0.2.RELEASE
に変更し、後述の手順を踏めば解消されます。
[画像の説明]
(1-1):pom.xmlにてエラーが出ているため、❌アイコンが表示される。
(1-2):pom.xmlを開くと詳細なエラー画面が表示される。
→ただし不明なエラー。。
(2-1):pom.xmlファイルの表示方法選択画面
[概要]を選択すると見た目がオシャレになる(ぽむぽむの外面を見れる)。しかし、今回は生データ(ポムポムの内面)をみたいので、pom.xmlを選択する。
(2-2): 依存するjarファイル が表示される。
プロジェクト作成時に選んだ、thymeleafやwebが表示されていることから、新たにjarファイルを追加したい場合は、ここに追記すればいいみたい。
(3):不明なエラーが出る原因の記述。
厳密にはspring-bootの
2.1.5.RELEASE
をローカルにインストールした方が良いのでしょうが、特にバージョンに対する指定は無いはずなので今回はスルーします。
pom.xml変更による新たなエラーが!!
エラー内容を見るに、pom.xmlを変更した場合は手動で更新してあげる必要があるようです。
pom.xmlの更新手順
作業中のプロジェクトを右クリックした際に表示されるメニューから[Maven※1]→[プロジェクトの更新]を選択します。
※1(メイバン)と読むみたいです。
すると「Maven プロジェクトの更新」画面が表示されるので、何も変更せずに[OK]を押せば、pom.xmlが更新されます。
これで、pom.xmlのエラーは解消されました。
簡単なWebAPIを作ってみよう編
一先ずwebブラウザにアクセスすると、「文字列」を表示する部分だけを試してみました。
『助走本』に従って以下のソースを記述するだけで動作しました。
package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("api") public class WebApiController { @RequestMapping("hello") private String hello() { return "SpringBoot!"; } }
上記ソースで肝となるのは、@RestController
や@RequestMapping
などのアノテーションと呼ばれる記述です。
アノテーション(英語:annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること
引用;Wikipedia
Springに対して、クラスやメソッドの役割を教えるためにアノテーションをつけているようです。
今回登場したアノテーションの意味は下表のとおりです。
アノテーション名 | 説明 |
---|---|
@RestController | HTMLページでなく、JSONやcsv形式のデータを返すコントローラであることを意味する。 |
@RequestMapping | 引数に指定したパスに対して、クライアントがリクエストを出した時に呼ばれるメソッドやハンドラをマッピングする。 |
ブラウザに文字列を表示するまで
前述のソースを『助走本』の手順に従って実行させると、次のようなログが出力されます。
内部でApachを起動しローカルサーバーを立ち上げてくれるようです。
実行開始してから10秒程度待つとログが止まりサーバーの起動が完了します。
この状態でブラウザからhttp://localhost:8080/api/hello
にアクセスすると、「SpringBoot!」の文字が表されました。
#URLは各パスは次の設定によって決まります。 http://localhost:8080/api/hello →「http://localhost:」は固定。 →「8080」はapplication.propertiesで指定したポート番号 →「/api/hello」は@RequestMappingに指定したパス。
おまけ
本当にappachプロセス起動しているか疑問に思ったので、実行中と停止中に次のコマンドを実行し比較してみました。
$ ps -ax | grep apache
すると、実行中だけ、仮想端末ファイル名が??で、鬼のように長い文字列をひっさげたプロセスがヒットしました。 因みに、「ttys001」はgrepを実行したプロセスです。
$ ps -ax | grep apache 4451 ?? 0:10.81 /Library/Java/JavaVirtualMachines/..5000文字あったので省略 4824 ttys001 0:00.00 grep apache
多分これがApachプロセスだろうと予想して、鬼のように長い文字列を眺めていると、次のように一定のルールに従って記述されている箇所がありました。
-classpath [.jarファイルのパス]:[.jarファイルのパス]:[.jarファイルのパス]
-classpath
について調べてみると、次のような記述を見つけました。
他のフォルダにソースファイルやクラスファイル、jarファイルなどを保存している場合はクラスパスを設定する必要があります。 クラスパスを設定する方法には2種類あります。 コマンドでコンパイルや実行するときに-classpathオプションを指定する方法と、CLASSPATH環境変数を設定する方法です。
引用:Samrai Blog
どうやら、実行時に必要なパッケージのパスを指定しているようです。
-classpath
が何か分かったところで、改めて見てるとapache
と言う名前のパッケージを見つけました。(なぜ、3つもいるかはスルーします。)
というわけで『助走本』に書いていた「実行時に裏でApach起動してくれている」ことの確証が取れました。
/Users/98hira/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar: /Users/98hira/.m2/repository/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar: /Users/98hira/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.31/tomcat-embed-websocket-8.5.31.jar:
因みに、パッケージが/Users/98hira/.m2/repository/
直下にいるのは、プロジェクト作成時に以下で指定したMavenの影響みたいです。
デフォルトでは、Mavenローカルリポジトリのデフォルトは
$ {user.home}/。m2/repository
フォルダです:Mavenプロジェクトをコンパイルすると、Mavenはすべてのプロジェクトの依存関係とプラグインjarをMavenローカルリポジトリにダウンロードして、次のコンパイルの時間を節約します。
要するにMavenのキャッシュ領域みたいです。
Eclipce環境下でMavenのローカルキャッシュによりハマったため、備忘録として残したいと思う。
ただし、ハマるケースもあるみたいです。その時はキャッシュ領域を削除し、今回説明した「pom.xmlの更新手順」を行えば改善されるようです。
参考情報
→参考にした『助走本』です。
https://ryoutaku-jo.hatenablog.com/
→ブログ投稿のモチベーションを維持するための情報源です。
最後に
若干横道に逸れた気がしますが、色んな記事を引用してコメント入れてそれっぽくしたので、『助走本』の劣化コピーにはならないはずです。😅