代码可以在嵌入式Apache Tomcat 8中运行,但无法在9中运行。发生了什么变化?

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

如果你一个接一个地测试它们,你是否杀死了已经在8080端口上监听的第一个? - SHG
是的。我遵循的步骤是先停止运行程序,然后更改依赖项,再重新运行。在多次尝试中,结果都是8个正常工作,而第9个不正常。 - Benjq
你的版本号出了严重的问题。最新的Tomcat 8.0.x是8.0.50,最新的Tomcat 8.5.x是8.5.28。你实际运行的是哪个版本? - Christopher Schultz
我在提到嵌入式Tomcat 8时,确实是指版本8.0.50。我也尝试过8.5.28,它也可以工作。当然,问题始于9。 - Benjq
1个回答

40

看起来你还没有为你的嵌入式服务器添加一个 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”的事情。


太棒了!就Tomcat 9的变化而言,这似乎是正确的答案。添加tomcat.getConnector()使服务器启动并响应。但是它会出现500错误,我需要使用Jersey为RESTful系统进行配置。如果您或任何人能指导我在此目的下正确使用连接器的方法,我将不胜感激。我自己搜索过,但结果要么无用、过时,要么与我的目的无关。 - Benjq
@Benjq 最好的提问地点是Tomcat用户邮件列表。 - Christopher Schultz
这在我的本地设置中非常有效。但是,作为一个相关的问题,我该如何将其添加到升级了Tomcat从8到9的Linux服务器上?它应该放在server.xml的哪个位置? - ghoulfolk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接