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"]
組み込みサーバーに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のみ」のものである必要はありません。