簡単なJSPとJavaのセットを作ってDockerで動かす

[前回](https://qiita.com/mm0kan/items/3b513d218ce20de05e1f)はTomcatのDockerイメージ（公式）にHTMLだけ追加してオリジナルのDockerイメージを作る…というのをやったので、今回はJavaも追加して動的アプリケーションを作っちゃおう～と思いました。前回作ったDockerイメージにJavaクラスを追加してindex.htmlをちょっと修正したらいけるだろう…と思っていたのですが、なんだか無理そうなのでEclipse先生とかjersey（JavaでREST APIを作るためのフレームワーク）様の力を借りたいと思います。
##ざっくり手順
1）事前準備（各種ツールのダウンロード）
2）とりあえずEclipseで動くプロジェクトを作る
3）プロジェクトをWARでエクスポートしてDockerで動かす
##使ったもの
Docker Desktop for Windows
Windows PowerShell
Eclipse
###1）事前準備
それぞれ以下の公式サイトからダウンロード
[Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows/)
[Windows PowerShell](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)
[Eclipse](https://mergedoc.osdn.jp/)　※JavaのFull Editionを入れました
###2）とりあえずEclipseで動くプロジェクトを作る
①Mavenプロジェクトの作成
・Eclipseを立ち上げて「ファイル→新規→Mavenプロジェクト」をクリック
・デフォルト・ワークスペース・ロケーションの使用にチェックのまま「次へ」をクリック
・アーキタイプはgroupId=org.glassfish.jersey.archetypes/ArtifactId=jersey-quickstart-webappを選択して「次へ」をクリック
・任意のグループID、アーティファクトID、バージョン（デフォルトでOK）、パッケージを設定する
・作成されたプロジェクトを右クリックして「プロパティ」を選択→「Javaのビルドパス」を選択して実行環境をJavaSE-11に設定しておく
※バージョンがズレていると実行時にエラーでうまくいかなくなるので注意→詳細は[こちら](https://qiita.com/mm0kan/items/adf41ab3e910a19c080d)参照
これでサンプルプログラムつきのMavenプロジェクトができたので、サンプルプログラムをベースにしてJavaとJSPを作成する
②Javaクラスの作成
デフォルトでMyResource.javaが作成されているので、それを真似てWelcomeResource.javaを作成

```welcomeresource.java
package ukaf.simple2;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;

@Path("welcome")
public class WelcomeResource {
	   @GET
	    @Produces(MediaType.TEXT_PLAIN)
	    public String getMsg(@QueryParam("name") String name) {
		   System.out.println(name);
	        return "Welcome " + name + " !!";
	    }
}
```
③index.jspの作成
デフォルトのindex.jspに少し追記（5行目）

```index.jsp
<html>
<body>
    <h2>Jersey1 RESTful Web Application!</h2>
    <p><a href="webapi/myresource">Jersey resource</a>
    <p><a href="webapi/welcome?name=YOURNAME">Go to welcome-page</a>
    <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
    for more information on Jersey!
</body>
</html>
```
④ビルド～テスト
・プロジェクトを右クリックして「実行→Mavenビルド」を選択
・コンソールタブにBUILD SUCCESSが表示されたことを確認したら、サーバタブを選択
・Tomcat10_java16を右クリックして「開始」を選択
・起動後、以下のURLにアクセスをする
http://localhost:8080/simple2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261367/b21384d4-2d79-fcb6-eccc-23bcb3391fb9.png)
→Jersey resourceをクリックするとデフォルト作成されていたリソース（/myresource）を呼び出す
→Go to welcome-pageをクリックすると自作したリソース（/welcomeresource）を呼び出す

http://localhost:8080/simple2/webapi/myresource
画面に「Got it!」と表示される
http://localhost:8080/simple2/webapi/welcome?name=YOURNAME
画面に「Welcome YOURNAME !!」と表示される
###3）プロジェクトをWARでエクスポートしてDockerで動かす
①WARを作成
・Eclipse上でプロジェクトを右クリックして「エクスポート」を選択
・「WARファイル」を選択
・任意の保存先を指定して「完了」をクリック
②Dockerfileを作成
・WARの保存先と同じ場所にDockerfileを新規作成（拡張子はなし）
・以下のように記述

```Dockerfile
FROM tomcat:latest

COPY simple2.war $CATALINA_HOME/webapps/
WORKDIR $CATALINA_HOME
$CATALINA_HOMEは/usr/local/tomcat

CMD ["catalina.sh","run"]
```
③ビルド～テスト
Windows PoweShellでDockerfileとWARの保存先まで移動して、以下を実行
``docker build . -t welcome:1.0``
``docker run -it --rm -p 8880:8080 welcome:1.0``
完了後、以下のURLにアクセス、2）④と同じ結果を得られることを確認
http://localhost:8880/simple2/
http://localhost:8880/simple2/webapi/myresource
http://localhost:8880/simple2/webapi/welcome?name=YOURNAME

以上です！

###参考
Mavenプロジェクト作成
https://qiita.com/kamegu3/items/e492dacdb71a3f3a8c94
DockerでWARファイルを実行
https://qiita.com/tatematsu-k/items/2bdd2808a66f5cbd16ca