Jettyの使い方3、Embedded-Jettyにwarファイルを配備

2018年8月31日

※Jettyに関する全投稿は/tag/jettyにあるので参照されたい。

Embeddedとして使うJettyにWarファイルを配備する。バージョンは9.4.8である。

配備の仕方

これは単純だ。

    WebAppContext war = new WebAppContext();

    // コンテキストパスの指定
    war.setContextPath("/wt");    

    // ディレクトリインデックスの表示禁止
    war.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");

    // warファイルのありかを指定
    war.setWar("....../sample.war");

とした後に、WebAppContextはContextHandlerであるので、Jettyの使い方1で見たようにContextHandlerCollectionに追加してやればよい。

ディレクトリインデックスの禁止

上記の「ディレクトリインデックスの表示禁止」を行わないと、以下が表示されてしまう。

表示禁止を行うと以下になる。

しかし、403になってしまう。もちろん、Jettyサーバの方に設定したデフォルトのハンドラは使用されないようだ。404の場合でも同じだ。

warの403や404のハンドリングを行うには?

setErrorHandlerでエラーハンドラを設定すれば良いらしい。とりあえず、設定してみて、呼び出されることを確認する。

    war.setErrorHandler(new ErrorHandler() {
      public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("error handler");
      }
    });

とりあえず何も返さないので、ブラウザには何も表示されない。

.warファイルではなく、.warファイルを展開した後のディレクトリ構造は使用できるのか?

可能だ。setWarの代わりに、setResourceBaseを呼び出せばよい。

 war.setResourceBase("...../sample");

sample以下に次のようなディレクトリ構造があるものとする。

warの場合には展開されてしまうことに注意

.warファイルを配備した場合、Jettyは実行前にそれを展開してしまう。展開先としては、通常の一時ファイル領域が用いられる。

例えばWindowsの場合で、ユーザ名がadminの場合には、以下のようなものになる。

C:\Users\admin\AppData\Local\Temp\jetty-0.0.0.0-8080-webterm.war-_wt-any-7725045132932423229.dir

この下にwebappディレクトリが作成され、そこに.warが展開されている。

そして、このdir自体は、.warファイルがなくとも、Jettyの実行ごとに作成されるようだ。