Maven 入門 | Web アプリケーション開発 | jetty-maven-plugin で Web を実行

Web アプリケーションの開発では、毎回「パッケージを作成して war ファイルを Java サーバーにデプロイして……」とするよりも、すぐに Java サーバーを起動し、そこにビルドした Web アプリケーションを起動して動作確認できると非常に便利である。

そこで、サーブレットコンテナ “Jetty” を利用して動作確認できる仕組みを用意してみよう。行うことは、もちろん pom.xml の編集である。

今回はいろいろ行うことが多いので、まず完成版を示しておく。今回のプロジェクトの完成した pom.xml は次のとおりである。初めて見るものもいくつかあるが、まずはこのとおりに書き直す。

<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>com.devkuma</groupId>
  <artifactId>SampleWebApp</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>SampleWebApp Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty.version>9.4.8.v20171121</jetty.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jetty.version}</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-webapp</artifactId>
      <version>${jetty.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>SampleWebApp</finalName>
    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.version}</version>
      </plugin>
    </plugins>
  </build>
</project>

インストール実行

修正した後、プログラムをビルドしてローカル環境にインストールする。次のコマンドを実行する。

$ mvn install

このコマンドは、ビルドしたプログラムをローカルリポジトリ、つまりローカル環境のライブラリを管理する場所にインストールするものだ。ただし、ここでは必要なライブラリのダウンロード、プログラムのビルド、war ファイルの生成といった一連の作業を行う目的で実行している。

初めて実行するときは、必要なライブラリを中央リポジトリからダウンロードする。そのため、かなり時間がかかる。2 回目以降は自分のコンピュータにすでにダウンロードされているため、それほど時間はかからない。

Jetty の実行

プログラムが正常にビルドされたら、Jetty を使って Web アプリケーションを実行する。これは次のコマンドで実行できる。

$ mvn jetty:run

このコマンドも、初めて実行するときには必要なライブラリを中央リポジトリからダウンロードする。そして Jetty を起動し、生成された Web アプリケーションをデプロイする。起動処理が完了したら、次のアドレスにアクセスしてみる。

http://localhost:8080/

Web ブラウザが開くと、画面に “Hello World!” と表示される。これは webapp の中に標準で含まれている index.jsp が表示されたものである。これでサーバーが起動し、Web アプリケーションにアクセスできることを確認できる。

一通り動作確認をしたら、コマンドプロンプトまたはターミナルで Ctrl+C キーを押してコマンドの実行を中断する。するとサーバーが終了し、元の入力待ち状態に戻る。

プロパティと変数

では、作成した pom.xml について見ていこう。まず目につくのはパッケージに関する設定である。

<packaging>war</packaging>

これである。このようにすると、ビルドされたプログラムは Jar ファイルではなく war ファイルとして作成される。Web アプリケーションの場合、<packaging> は war が基本である。

プロパティについて

また、非常に重要な役割を持つのが <properties> タグである。作成した pom.xml では次のように書かれている。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty.version>9.4.8.v20171121</jetty.version>
</properties>

<project.build.sourceEncoding> タグはすでに説明した。ソースファイルのエンコーディングを指定するものである。

もう 1 つは <jetty.version> というタグである。これは Jetty のバージョンを指定する。ここでは 9.4.8.v20171121、2017 年 12 月時点の最新バージョンが jetty.version というプロパティに指定されている。

これがどのように利用されているかは、他の場所を見るとわかる。たとえば <dependencies> タグを見ると、次のように書かれている。

<version>${jetty.version}</version>

この ${jetty.version} によって、<jetty.version> の値を設定している。${jetty.version} は jetty.version という変数である。つまり、<jetty.version> は jetty.version という変数を作成していることになる。

Jetty バージョンの変数である jetty.version は、この名前が決まっているわけではない。わかりやすい名前を付けただけである。変数名は好きなように付けてかまわない。たとえば “myval” という変数を使いたいなら、<myval> というタグで値を用意し、${myval} という形で変数を利用する。

pom.xml では、特定のバージョンに合わせてライブラリを用意することがある。このようなとき、あらかじめ変数を用意してバージョン名を設定し、その変数を使って各ライブラリを構成できるようにする場合がある。

こうしておけば、たとえばバージョンを変更するときも <jetty.version> の値を書き直すだけで済む。各ライブラリに個別に値を書いていると、すべての値を探して変更しなければならない。その結果、変更されずに古いバージョンのまま残るライブラリが出てくるかもしれない。

このように <properties> タグにプロパティを用意して変数を作る方法は、多数のライブラリやプラグインなどで利用できる必須機能である。

Jetty の利用について

今回は Maven の機能の中でも特に重要な「依存ライブラリ管理」を行っている。<dependencies> タグを見てみよう。JUnit ライブラリのほかに 2 つのライブラリ設定が追加されていることがわかる。

依存ライブラリ

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>${jetty.version}</version>
</dependency>

これらは Jetty の利用に関するものである。それぞれの役割を簡単に説明すると次のようになる。

jetty-server

1 つ目は Jetty サーバーのライブラリである。Jetty サーバーの基本ライブラリが含まれる。

jetty-webapp

これは Jetty Webapp、Security、Servlet、XML など、Web アプリケーション関連のライブラリ群を含む。このライブラリがなくても Jetty サーバー自体は起動できるが、Web アプリケーションで使用されるリソースによっては動作に問題が出る可能性があるため、jetty-server とセットで用意する。

Jetty プラグイン

ライブラリのほかに、Jetty サーバーを起動するプラグイン設定も必要である。jetty-maven-plugin というもので、グループ ID、アーティファクト ID、バージョンの最低限の設定だけを用意すればよい。

Jetty プラグイン

<build>
    <finalName>SampleWebApp</finalName>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>${jetty.version}</version>
        </plugin>
    </plugins>
</build>

前に mvn jetty:run で Jetty を起動したが、それを可能にしていたのがこの Jetty プラグインである。特別な設定も必要なく簡単である。このプラグインによって、Jetty を使った Web アプリケーションの実行が可能になる。

以上のように、2 つの <dependency> と 1 つの <plugin> を追加すれば、Jetty で Web アプリケーションを実行できる。Web アプリケーション開発の基本機能として使い方を覚えておこう。