代码适用于嵌入式 Apache Tomcat 8,但不适用于 9。更改了哪些内容?

2022-09-04 05:47:34

将Apache Tomcat嵌入到eclipse Web应用程序项目中。
当我使用最新的Tomcat 8(8.0.5 Embedded)jar作为依赖项时,代码可以工作,并且该服务器以 http://localhost:8080 响应,但是,当使用最新的Tomcat 9(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"]

答案 1

看起来您尚未向嵌入式服务器添加 。Tomcat 9 不再自动为您添加到服务器,因此您必须自己触发它:ConnectorConnector

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也应该是安全的,所以这不一定是“Tomcat 9-only”的事情。tomcat.getConnector()


答案 2

推荐