代码适用于嵌入式 Apache Tomcat 8,但不适用于 9。有什么变化?
Code works with Embedded Apache Tomcat 8 but not with 9. What's changed?
将 Apache Tomcat 嵌入到 eclipse 网络应用程序项目中。
当我使用最新的 Tomcat 8(8.0.5 嵌入式)jar 作为依赖项时,该代码有效,并且此服务器在 http://localhost:8080 响应,但是,它无法以相同的方式启动并且不响应在使用最新的 Tomcat 9's (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"]
您似乎还没有向嵌入式服务器添加 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" 事情。
将 Apache Tomcat 嵌入到 eclipse 网络应用程序项目中。
当我使用最新的 Tomcat 8(8.0.5 嵌入式)jar 作为依赖项时,该代码有效,并且此服务器在 http://localhost:8080 响应,但是,它无法以相同的方式启动并且不响应在使用最新的 Tomcat 9's (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"]
您似乎还没有向嵌入式服务器添加 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" 事情。