VSCodeでTomcatを使ったWebApp開発 (cargo編)

VSCodeのJava Web開発をTomcatでやる方法のcargo-maven3-pluginを使ったやり方。

cargoを使ったやりかたはGUIは整っていないが、mavenだけで完結してできるのですぐに環境を整えられるのが良い。

  • VSCodeタスクからTomcatの起動
  • VSCodeタスクから起動中のTomcatに再デプロイ
  • VSCodeのリモートデバッグでアタッチしてステップ実行などの確認

Exampleソースコードはこちら。
https://github.com/civic/maven-single-module-webapp-cargo

Tomcatでの開発が多いためTomcatを使用しているが、Cargoは様々なWebコンテナをサポートしているため、Tomcat以外のJettyなどのコンテナも同様に設定可能。

Webアプリケーション

WebアプリケーションとしてはHello World的なServletを例として作成してある。

//Main.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class Main extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        var out = resp.getWriter();
        out.println("Hello Servlet! /" + new Date());
    }
}

pom.xml

mavenプラグインとして、cargo-maven3-pluginを設定。
これによりvscode関係なく、mavenから mvn war:war cargo:runするだけでwarを作成してデプロイしてtomcatを実行できる。

cargoにより自動的にTomcat9をダウンロードしてtargetディレクトリに展開し起動してくれる。
設定いらずなのは楽だがcleanすると消されてしまうので予め自分でダウンロードしたパスを選択したりできる。ダウンロードするzipファイルも指定できるので明示的に特定のバージョンのTomcatを入れることもできる。https://codehaus-cargo.github.io/cargo/Installer.html#Installer-Maven3Installer

        <plugin>
          <groupId>org.codehaus.cargo</groupId>
          <artifactId>cargo-maven3-plugin</artifactId>
          <version>1.9.13</version>
          <configuration>
            <container>
              <containerId>tomcat9x</containerId>
            </container>
            <configuration>
              <properties>
                <cargo.jvmargs>
                  -Xdebug
                  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
                  -Xnoagent
                  -Djava.compiler=NONE
                </cargo.jvmargs>
              </properties>
            </configuration>
            <deployables>
              <deployable>
                <groupId>com.example</groupId>
                <artifactId>single-module-webapp-cargo</artifactId>
                <type>war</type>
                <properties>
                  <context>/example</context>
                </properties>
              </deployable>
            </deployables>
          </configuration>
        </plugin>

task.json

task.jsonはVSCodeのための設定ファイルで使用することは必須ではないが、mavenコマンドで mvn cargo:run を実行する手間を省ける。またタスク経由から実行することで環境変数の指定ができる。
exampleコードでは、.vscode/task.json.exampleとして配置してあるので、それをtask.jsonにリネームすればすぐに使える。

2つのタスクを準備してあり cargo-run でcargoの起動と、cargo-redeploy で起動したままの再デプロイを実行できる。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "cargo-run",
            "type": "shell",
            "command": "mvn war:war cargo:run",
            "group": "build",
            "isBackground": true,
            "options": {
                "env": {
                    "MY_VAR": "abc123"
                }
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true,
                "showReuseMessage": false,
            }
        },
        {
            "label": "cargo-redeploy",
            "type": "shell",
            "command": "mvn war:war cargo:redeploy",
            "group": "build",
            "isBackground": true,
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "showReuseMessage": false,
            }
        }
    ]

}

launch.json

VSCodeでのデバッグ実行のための設定ファイルlaunch.jsonも.vscode/launch.json.exampleとして配置してある。

cargo:runで起動したTomcatに対してリモートデバッグでAttachしてデバッグする。

※preLaunchTaskでcargo-runのタスクを実行することで、デバッグ実行開始時にTomcatが起動するような仕組みにもでき、IDEっぽい実行が可能だが、起動完了の確認などが複雑で不安定なためそのような設定はしていない。

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Debug(attach)",
            "request": "attach",
            "hostName": "localhost",
            "port": 8000
        }
    ]
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)