web-dev-qa-db-ja.com

コードはEmbeddedApache Tomcat 8で機能しますが、9では機能しません。何が変更されましたか?

ApacheTomcatをEclipseWebアプリプロジェクトに埋め込む。
最新のTomcat8(8.0.5 Embedded)jarを依存関係として使用している場合、コードは機能します。このサーバーは http:// localhost:808 で応答しますが、最新のTomcat9(9.0.5 Embedded)jarを使用すると、同じ方法で起動できず、このアドレスで応答しません。
コードは非常に単純です。私はできる限り徹底的に調査しましたが、何が悪いのか理解できませんでした。

package app;

import org.Apache.catalina.LifecycleException;
import org.Apache.catalina.startup.Tomcat;

public class Main {

    public static void main(String[] args) {

        Tomcat tomcat = new Tomcat();
        Tomcat.setPort(8080);

        try {
            Tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }

        Tomcat.getServer().await();
    }

}

tomcat 9.0.5組み込みjarを使用した場合のコンソール出力:

org.Apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]

tomcat 8.0.5組み込みjarを使用した場合のコンソール出力:

org.Apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
org.Apache.Tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
org.Apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
org.Apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
11
Benjq

組み込みサーバーにConnectorを追加していないようです。 Tomcat9はサーバーにConnectorを自動的に追加しなくなったため、自分でトリガーする必要があります。

_package app;

import org.Apache.catalina.LifecycleException;
import org.Apache.catalina.startup.Tomcat;

public class Main {

    public static void main(String[] args) {

        Tomcat tomcat = new Tomcat();
        Tomcat.setPort(8080);
        Tomcat.getConnector(); // Trigger the creation of the default connector

        try {
            Tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }

        Tomcat.getServer().await();
    }
}
_

Tomcat.getConnector()への呼び出しの追加は、以前のバージョンのTomcatでも安全であるはずなので、これは「Tomcat9のみ」のものである必要はありません。

24