VSCodeでJersey開発環境を爆速で作る（Windows10）

# はじめに
Javaの開発からしばらく遠のいていたけども、触る機会があったのでREST API（Jerseyによる実装）を開発する環境を整えようと調べていたら、昔と今で開発環境の作り方が全然違ったので備忘録として手順を残す。結論から言うと、ローカルにJavaやTomcatをインストールする必要なく、開発環境を構築できる...。JDKやTomcatのバージョン修正なんかも1行書き換えるだけですぐ実行できてしまう...。すごいね。

# 手順
## Docker Desktopインストール
こちらからダウンロードし、インストール。
https://www.docker.com/products/docker-desktop
これがないと始まらないので、使えない場合はごめんなさい。

## VSCodeプラグインインストール

VSCodeで次の4つのプラグインをインストールする。

1. Language Support for Java(TM) by Red Hat
1. Java Extension Pack
1. Tomcat for Java
1. Remote Development

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/e9265a7e-4ee8-6392-f89f-bf8b3427ceae.png" width="600px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/8f723595-0f94-5a25-92cd-fab4d161b1b2.png" width="600px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/bd6ae5ac-0aec-1c36-187e-1d753a5ad468.png" width="600px" />

## mavenコンテナを立ち上げる
プロジェクト用のフォルダを作成し、そのフォルダでVSCodeを開く。
VSCode左下のリモートツールアイコンをクリックし、「Open Folder in Container」を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/02ff6133-8d5a-6ecb-7a4b-e1bc0ce3b91b.png" width="600px" />

どのフォルダをコンテナに接続するか聞いてくるので、そのまま「Open」ボタンを押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/78601621-6a01-9bae-55ba-8acc0caab7ad.png" width="400px" />

「Java」を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/6c9be89f-5606-3575-eb43-e46bc2c80e26.png" width="600px" />

11 or 16を聞いてくるので、「11」を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/65c07dae-7c44-541a-0fa4-5998a10c830f.png" width="600px" />

「Maven」にチェックし、「OK」ボタンをクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/eea1ff32-63fe-eca5-ecb0-44a46f11b2c8.png" width="600px" />

コンテナが起動される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/c23c58e1-fa42-80b7-eed6-212c5dbb2775.png" width="600px" />

コンテナの起動が完了すると、このような状態となる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/beda0bce-0c38-dba0-9bfe-49b336813ece.png" width="600px" />

## Jersey2インストール

次に、Jerseyをインストールする。次のページを参考に、mvnコマンドを実行する。
https://eclipse-ee4j.github.io/jersey/download.html
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/4ecdeffc-be3e-e4e5-1afd-e658ecb0f22f.png" width="600px" />

```
mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes \
    -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.34
```
ターミナルを立ち上げ、上記コマンドを実行する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/1ad31bc6-4aef-e34a-a469-acc3fd23191d.png" width="600px" />

インストールが進むと、groupId、artifactId、version、packageを聞いてくるので、環境に合わせて入力する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/04ccde56-1d4d-e349-d0e4-55842ed4f828.png" width="600px" />
入力例

<table>
<tr>
<td>項目</td>
<td>値</td>
</tr>
<tr>
<td>groupId</td>
<td>com.example</td>
</tr>
<tr>
<td>artifactId</td>
<td>jersey-sample</td>
</tr>
<tr>
<td>version</td>
<td>1.0-SNAPSHOT</td>
</tr>
<tr>
<td>package</td>
<td>com.example</td>
</tr>
</table>

インストール完了。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/d48c2f70-dfa7-695d-081d-510b7c8adf7c.png" width="600px" />

この時点で、次のようなファイルが生成されている。

```
jersey-sample
│  pom.xml
│  tree.txt
│
└─src
    └─main
        ├─java
        │  └─com
        │      └─example
        │              MyResource.java
        │              
        ├─resources
        └─webapp
            │  index.jsp
            │  
            └─WEB-INF
                    web.xml
```

ここで一旦VSCodeを終了する。

## tomcatコンテナ用の設定ファイルを作成する。

次の3つのファイルを作成する。

* .devcontainer/devcontainer.json
* .devcontainer/Dockerfile
* .vscode/settings.json

```
jersey-sample
│  pom.xml
│  tree.txt
│  
├─.devcontainer
│      devcontainer.json
│      Dockerfile
│      
├─.vscode
│      settings.json
│      
└─src
    └─main
        ├─java
        │  └─com
        │      └─example
        │              MyResource.java
        │              
        ├─resources
        └─webapp
            │  index.jsp
            │  
            └─WEB-INF
                    web.xml
```

``` 　.devcontainer/devcontainer.json
{
  "name": "tomcat",
  "dockerFile": "Dockerfile",
  "forwardPorts": [
    8080
  ],
  "workspaceFolder": "/opt/project",
  "mounts": [
    "source=${localWorkspaceFolder},target=/opt/project,type=bind,consistency=cached"
  ],
  "extensions": [
    "adashen.vscode-tomcat",
    "vscjava.vscode-java-pack"
  ]
}
```

``` 　.devcontainer/Dockerfile
FROM tomcat:jdk11-adoptopenjdk-hotspot

RUN mkdir /opt/project

RUN apt-get update && \
    apt-get -y install maven
```
DockerfileはJDK8のコンテナでも問題ないが、JDK8だとhotCodeReplaceが利用できない。
上記はtomcat9だが、Jersey3を動かしたい場合はtomcat10でなければ動かない。
JDK8の場合：FROM tomcat:8.5.49-jdk8-openjdk
Jersey3の場合：FROM tomcat:10.0.7-jdk11-adoptopenjdk-hotspot

``` 　.vscode/settings.json
{
  "java.debug.settings.hotCodeReplace": "auto",
  "java.home": "/opt/java/openjdk",
  "java.configuration.updateBuildConfiguration": "automatic"
}
```

/opt/java/openjdk はコンテナ側のJDKインストールフォルダ

## VSCode起動→コンテナ起動
上記までの手順で作成された「jersey-sample」フォルダでVSCodeを開き、リモートツールアイコンから「Open Folder in Container」を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/dda0d4c8-5f03-809d-1008-e8e494e8e807.png" width="600px" />

どのフォルダをコンテナに接続するか聞いてくるので、そのまま「Open」ボタンを押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/cab82541-477d-4183-6d6e-59619af47ab5.png" width="400px" />

コンテナが起動される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/5b2aec7b-9a47-d19d-12e5-8342845e5a82.png" width="600px" />

## Tomcatサーバ追加
画面左下の「TOMCAT SERVERS」にカーソルを合わせると「+」ボタンが表示されるので、クリックし、「/usr/local/tomcat/」を入力する。
この/usr/local/tomcat/はコンテナ側のフォルダ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/d85ac599-d0ba-3bab-d339-d5fbe0227e41.png" width="600px" />

Tomcatが登録されるので、右クリックし「Start」を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/0f94202f-0bb2-33ff-57f1-3ceac0b4aff3.png" width="600px" />

## pom.xml修正
現状ビルドすると警告が出るので、pom.xmlを開いてsourceおよびtargetのJDKバージョンを「1.8」から「11」に修正する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/a9c23d91-18e0-3626-54be-a47ea3eb9190.png" width="600px" />

同様にpom.xmlの「org.glassfish.jersey.media」がコメントアウトされているので、コメントを削除する。これをやらないとJsonObjectなどが利用できない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/6e0afbf1-d3e1-5313-58a4-d635c0b7097f.png" width="600px" />

## warファイル作成
ターミナルを開き、次のコマンドを実行する。

```
mvn package
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/15e7b3b3-9959-4284-223c-18eed4af2341.png" width="600px" />

## warファイル配備
コマンドが完了すると、targetフォルダ配下にwarファイルができているので、右クリックし、「Debug on Tomcat Server」を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/6a8b9dcb-50bb-0fc6-0933-bcfad378c555.png" width="600px" />

ブラウザを開き、http://localhost:8080/jersey-sample/webapi/myresource にアクセスすると、APIが動いているのを確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/3a9ee68c-fe0d-010b-6a83-c77ec4e0b2d7.png" width="600px" />

# 参考
* Visual Studio Code + Docker + Remote DevelopmentでTomcat上のWebアプリを超簡単にデバッグ  
https://tech-lab.sios.jp/archives/18917