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

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

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"]

person Benjq    schedule 26.02.2018    source источник
comment
Если вы тестировали их одну за другой, вы убили первую, которая уже прослушивает порт 8080?   -  person SHG    schedule 27.02.2018
comment
Да. Процедура, которой я следовал, заключалась в том, чтобы сначала остановить работающую программу, затем изменить зависимости и снова запустить. Результаты были одинаковыми во многих испытаниях с 8 работающими и 9 нет.   -  person Benjq    schedule 27.02.2018
comment
Что-то ужасно не так с вашими номерами версий. Последняя версия Tomcat 8.0.x — 8.0.50, а последняя версия Tomcat 8.5.x — 8.5.28. Какую версию вы на самом деле используете?   -  person Christopher Schultz    schedule 27.02.2018
comment
На самом деле, когда я имел в виду Embedded Tomcat 8, я имел в виду версию 8.0.50. Я пробовал и версию 8.5.28, и она тоже работает. Проблемы конечно начинаются с 9.   -  person Benjq    schedule 28.02.2018


Ответы (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».

person Christopher Schultz    schedule 27.02.2018
comment
Слава! Это кажется правильным ответом на то, что изменилось в Tomcat 9. Добавление tomcat.getConnector() заставило сервер запускаться и отвечать. Однако это ошибка с 500, и мне нужно настроить это с помощью джерси для системы RESTful. Я был бы очень признателен, если бы вы или кто-либо другой мог направить меня туда, где я мог бы продолжить обучение правильному способу работы с разъемом для этой цели. Я искал сам, но результаты были либо бесполезными, либо устаревшими, либо не подходящими для моей цели. - person Benjq; 28.02.2018
comment
@Benjq Лучшее место, где можно спросить, - это список рассылки пользователей Tomcat. - person Christopher Schultz; 28.02.2018
comment
Это сработало как шарм в моих местных условиях. Однако в качестве связанного вопроса: как я могу добавить это на сервер Linux, где tomcat также был повышен с 8 до 9? он должен идти куда-то в server.xml? - person ghoulfolk; 10.01.2020