嵌入在可执行jar中的Tomcat存档提取?
在内存或硬盘上的某个文件夹中?
与普通Tomcat相比,它需要多少资源?
答案 0 :(得分:3)
这可能不是一个完整的答案,但正如我可以解释的那样。我也在想,所以我做了一点挖掘。
<强> Tomcat的嵌入芯强>
使用春季启动时,我们通常会添加spring-boot-starter-tomcat
(通过spring-boot-starter-web
),其中包含tomcat-embed-core
。
如果你要创建一个普通的main方法,并将tomcat-embed-core-x.y.z.jar添加到你的类路径中,你可以这样做(来源:http://people.apache.org/~markt/presentations/2010-11-04-Embedding-Tomcat.pdf):
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
// Create a context
File docBase = new File(System.getProperty("java.io.tmpdir"));
Context ctxt = tomcat.addContext("",docBase.getAbsolutePath());
// Add a Servlet
Tomcat.addServlet(ctxt, "HelloWorld", new HelloWorldServlet());
ctxt.addServletMapping("/*", "HelloWorld");
// Start the instance
tomcat.start();
// Loop to serve requests
while(true) {
Thread.sleep(5000);
}
因此,当spring-boot-maven-plugin
打包uber-jar时,它包含jar中的tomcat-embed-core。
自动配置 - 新的Tomcat()
Spring Boot通过自动配置启动其功能,其中一个是EmbeddedServletContainerAutoConfiguration
:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class)
public class EmbeddedServletContainerAutoConfiguration {
...
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
如果在类路径中找到tomcat
和Servlet
,则TomcatEmbeddedServletContainerFactory
将被实例化,并且一切都会启动..
在spring-boot(EmbeddedWebApplicationContext.refresh
)中的某个地方,通过调用TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer()
创建一个Tomcat实例,该new Tomcat()
执行new Tomcat()
;
从现在开始
从这一点来说,我可以与简单的主要方法相关,做一个简单的d.items()
。
对我来说,这就是Spring Boot所做的事情,然后注册所有的Servlet。其余的都是好春天。
显然,Spring Boot提供了大量的AutoConfiguration和属性来配置几乎所有东西!
这有点帮助,也许你知道这一点并且希望更多吗?