サーブレットコンテナの種類を判別する

warファイルのプログラム中から、それが載っているサーブレットコンテナの種類を判断したい。例えば、tomcatなのか、jettyなのかだ。

これが意外にわからない。サーブレット仕様にはどうもそのようなものが無いようだ。唯一発見したのは以下である。

要するに、どのサーブレットにも”default”サーブレットが用意されているので、ServletContextからそのRequestDispatcherにアクセスしろという。そして、その実装クラス名から判断せよという。

つまり、こんなところだ。ここではJettyか、あるいはJetty以外かを判断している。当方ではJetty/Tomcatの二つにしか対応しないのでこれで十分だ。

public class ServletContainerDetector {

  private static boolean jetty;

  /** 
   * サーブレットコンテナからリクエストディスパッチャの名称を取得し、
   * その名前からどのサーブレットコンテナであるかを判断する。
   */
  public static void setup(ServletContext sc) {
    if (sc == null) return;
    RequestDispatcher rd = sc.getNamedDispatcher("default");
    if (rd == null) return;
    jetty = rd.getClass().getName().toLowerCase().indexOf("jetty") >= 0;
  }

  /** Jettyか */
  public static boolean isJetty() {
    return jetty;
  }
}