Код работает с 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".