Magnolia Tech

いつもコードのことばかり考えている人のために。

jetty-homeとwarファイルを使ってWebアプリケーションを起動する

ドキュメントを読んでいてもよくわからなかったので試したことのメモ。

sbtの中からテスト用にServletコンテナ(JettyとかTomcatとか)を起動するxsbt-web-pluginというsbt pluginが有る。

github.com

いつからか、このプラグイン経由でjettyを起動すると以下のようなアラートが出るようになっていた。

WARNING: jetty-runner is deprecated.
         See Jetty Documentation for startup options
         https://www.eclipse.org/jetty/documentation/

しかし、ドキュメントへのリンク先は全体のトップページだし、辿っていった以下のドキュメントにも普通に使い方が書かれているだけでdeprecatedになった件に関する情報は書かれていなかった。

https://www.eclipse.org/jetty/documentation/9.4.35.v20201120/#runner

Issueを辿っていくと、2017年に上げられた話だそうだ。xsbt-web-pluginが内部で使っているjetty-runnerというモジュールが非推奨になっている。

github.com

jetty-runnerはすべてのモジュールを単一のjarに含めて提供する形式なのだけど、Java9以降のモジュールシステムを考慮すると、それは適切ではない(何を持って全部入りと言えなくなるから?)、という趣旨のようだ。

将来リリースされるJetty 10や、並行で開発が進んでいるJetty 11ではまだ残っているようだけど、いつ削除されるかは分からない(Java9で導入されたモジュールシステムがどの程度利用されるのかは分からないけど……)ので、ここは一つ他のやり方を探した。


jetty-home

jetty-runnerの代わりに推奨されているのは、jetty-homeだ。

jettyのディストリビューションは2種類用意されていて、デモアプリなどを含んだjetty-distributionと、サーバとして必要最小限なもののみを含んだjetty-homeの2種類が用意されている。なぜかjetty-distributioneclipse foudationのサイトから配布されているのに、jetty-homemaven repositoryから配布されている。

https://www.eclipse.org/jetty/download.html

https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-home/

基本的な使い方

> JETTY_BASE=/tmp/mybase
> mkdir $JETTY_BASE
> cd $JETTY_BASE
> java -jar $JETTY_HOME/start.jar --create-startd
> java -jar $JETTY_HOME/start.jar --add-to-start=http,deploy
> cp {warファイルへのパス} webapps/{warファイル名}.war
> java -jar $JETTY_HOME/start.jar

これで起動します。ただし、このままではhttp://localhost:8080/{warファイル名}が初期エントリポイントになってしまうので、webappsディレクトリに、マッピング用のxmlファイルを作成します。名前はなんでも良いですが、拡張子xmlを忘れずに。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
  "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/j</Set>
    <Set name="war">{warファイルへの絶対パス}</Set>
</Configure>

例えばcontextPathに、/jettyとつければ初期アドレスは、http://localhost:8080/jettyになります。

これから

ということでsbtプラグインの中で、これらダウンロード、ディレクトリ構成の作成、アプリの配置、起動などができれば、deprecatedなAPIを使わなくてもよくなる、というわけです。今日はここまで。