代码适用于嵌入式Apache Tomcat 8但不适用于9。有什么改变?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码适用于嵌入式Apache Tomcat 8但不适用于9。有什么改变?相关的知识,希望对你有一定的参考价值。

将Apache Tomcat嵌入到eclipse Web应用程序项目中。 当我使用最新的Tomcat 8(8.0.5 Embedded)jar作为依赖项时,代码工作,并且此服务器在http://localhost:8080响应,但是,它无法以相同的方式启动,并且在使用最新的Tomcat时不响应此地址9(9.0.5嵌入式)罐子。 代码很简单。我尽可能彻底地研究,但没有弄清楚什么是错的。

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

您好像没有在嵌入式服务器中添加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”的东西。

以上是关于代码适用于嵌入式Apache Tomcat 8但不适用于9。有什么改变?的主要内容,如果未能解决你的问题,请参考以下文章

mod_ssl 2.8.31 是不是适用于 Apache 2.2?

Proxy 后面的 SpringBoot 适用于 Undertow,但不适用于 Tomcat

适用于 Windows/Node 0.8 的 Node.js 键值存储

在 spring-boot 中配置嵌入式 apache tomcat 内的“tomcat-server.xml”文件

mJS:适用于C/C++的嵌入式JavaScript引擎

具有嵌入式 Tomcat 和通用名称 (CN) 的双向 TLS