Код работает с Embedded Apache Tomcat 8, но не с 9. Что изменилось?

Встраивание Apache Tomcat в проект веб-приложения eclipse.
Код работает, когда я использую последние фляги Tomcat 8 (8.0.5 Embedded) в качестве зависимостей, и этот сервер отвечает по адресу http://localhost:8080/, однако он не запускается так же и не отвечает в этом адрес при использовании последних фляг Tomcat 9 (9.0.5 Embedded).
Код очень прост. Я исследовал так тщательно, как только мог, но не понял, что не так.

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 Embedded jar:

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

вывод консоли при использовании Tomcat 8.0.5 Embedded 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"]

1 ответ

Решение

Похоже, вы не добавили Connector на ваш встроенный сервер. Tomcat 9 больше не добавляет автоматически 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, так что это не обязательно должно быть "Tomcat 9-only".

Другие вопросы по тегам