【问题标题】:Code works with Embedded Apache Tomcat 8 but not with 9. What's changed?代码适用于 Embedded Apache Tomcat 8,但不适用于 9。有什么变化?
【发布时间】:2019-01-23 01:28:46
【问题描述】:

将 Apache Tomcat 嵌入到 Eclipse Web 应用程序项目中。
当我使用最新的 Tomcat 8 (8.0.5 Embedded) jar 作为依赖项时,该代码有效,并且此服务器响应 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 jars 时的控制台输出:

org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Tomcat]

使用 Tomcat 8.0.5 Embedded jars 时的控制台输出:

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 上监听的?
  • 是的。我遵循的过程是首先停止正在运行的程序,然后更改依赖关系,然后重新运行。经过多次试验,结果是相同的,8 个有效,9 个无效。
  • 您的版本号有问题。最新的 Tomcat 8.0.x 是 8.0.50,最新的 Tomcat 8.5.x 是 8.5.28。你实际运行的是什么版本?
  • 确实,当提到 Embedded Tomcat 8 时,我指的是版本 8.0.50。我也尝试过 8.5.28,它也可以工作。问题当然从 9 开始。

标签: java tomcat embedded-tomcat-8


【解决方案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”的事情。

【讨论】:

  • 赞!就 Tomcat 9 中的变化而言,这似乎是正确的答案。添加 tomcat.getConnector() 使服务器启动并响应。但是它确实会出现 500 错误,我需要为 RESTful 系统使用 jersey 配置它。如果您或任何人能指导我到哪里我可以进一步教育自己为此目的使用连接器的正确方法,我将不胜感激。我搜索了自己,但结果要么没用,要么过时,要么与我的目的无关。
  • @Benjq 最好去问Tomcat用户的邮件列表。
  • 这对我的本地环境来说就像一个魅力。不过,作为一个相关问题,如何将其添加到 linux 服务器中,其中 tomcat 也从 8 提升到 9?它应该放在 server.xml 的某个地方吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多