gwt-devのJettyを変更する方法

2019年7月14日

jettyについての全投稿は/tag/jettyにあるので参照されたい

gwt-devにはJettyが組み込まれている。これは開発時にのみ使用されるものであり、デプロイ時には不要になるのだが、そうすると、開発環境とデプロイ環境で異なるJettyのバージョンとなってしまう可能性もある。

これを統一するには、どうすれば良いのか?つまり、

  • あるバージョンのgwt-dev中では、どのバージョンのJettyが使われているのか?
  • gwt-devのJettyを無視して、別のバージョンのJettyを開発環境で使う方法はあるのか?

以下に解説してくれている人がいる。

gwt-devに使われているJettyバージョンを知る方法

GWTはオープンソースであり、https://gwt.googlesource.com/gwt/にそのソースコードがあるようだ。

例えば、いまGWT2.8.2のJettyバージョンを知りたいとすると、Tagsから2.8.2を選択し、dev/というフォルダを選択し、build.xmlを見てみる。つまり、https://gwt.googlesource.com/gwt/+/2.8.2/dev/build.xmlになる。

ここでjetty関係を探してみると、複数あるのだが、おそらくこれだろう。

<include name="jetty/jetty-9.2.14.v20151106/jetty-all-9.2.14.v20151106.jar"/>

つまり、2.8.2環境で開発したものをデプロイする場合には、一緒にjetty-9.2.14.v20151106を組み込んでやればよい。

ちなみに、過去のGWTバージョンで組み込まれるJettyのバージョンとしては以下だ。

  • 2.6.1 : jetty-8.1.12.v20130726
  • 2.7.0 : jetty-8.1.12.v20130726
  • 2.8.0 : jetty-9.2.14.v20151106
  • 2.8.1 : jetty-9.2.14.v20151106
  • 2.8.2 : jetty-9.2.14.v20151106

GWTバージョン毎に変わるわけではなく、ある程度同じバージョンのJettyを長い期間使うことがわかる。

gwt-devに使われているJettyとは別のJettyを使う方法

ServletContainerLauncherを使えとある。これはabstractクラスなので、この実装を作成して、それクラスをDev Modeでの起動時に指定するらしい。Dev Modeの起動パラメータは以下にある。

https://gwt-plugins.github.io/documentation/gwt-eclipse-plugin/reference/DevMode.html

この中の以下の部分だ。

-server Specify a different embedded web server to run (must implement ServletContainerLauncher)

そして、デフォルトで使われているServletContainerLauncherの実装が、「com.google.gwt.dev.shell.jetty.JettyLauncher」である(GWT2.8.2の場合)。

要するに、これをまるまるコピーして、自分で用意したJettyのバージョンを動かすようにすれば良いらしいが、しかし、gwt-dev.jarに入っているJettyとパッケージ名が全く同一であるのに、どうやって別の実装を使わせれば良いのだろうか。。。。

追加:

Java12上でDevModeを動作させるという必要にせまられ、Jettyを最新版にしてみた。GWT2.8.2をJava9以上で動かすにて説明している。

先の-server引数指定は、元のgwt-dev.jarのままでJettyを使う限りは意味がない。なぜなら、このままJettyの最新版を入れたとしても、相変わらずgwt-dev.jarの中の古いバージョンが使われてしまう可能性が高いからだ。