【问题标题】:Where the embedded Tomcat extracts?嵌入式Tomcat提取到哪里?
【发布时间】:2017-01-12 05:46:43
【问题描述】:

嵌入在可执行jar Tomcat 存档中的提取物在哪里?

在内存中还是在硬盘上的某个文件夹中?

与普通的Tomcat相比需要多少资源?

【问题讨论】:

    标签: tomcat spring-boot embedded-tomcat-7


    【解决方案1】:

    这可能不是一个完整的答案,但我可以解释一下。我也想知道,所以我做了一点挖掘。

    tomcat-embed-core

    对于spring boot,我们通常包括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();
            }
        }
    

    如果在类路径中找到tomcatServletTomcatEmbeddedServletContainerFactory 将被实例化,然后一切就开始了..

    在 spring-boot (EmbeddedWebApplicationContext.refresh) 的某个地方,通过调用 TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer() 创建一个 Tomcat 实例,它执行 new Tomcat()

    从现在开始

    从这一点上,我可以联系到简单的 main 方法,做一个简单的new Tomcat()。 对我来说,这就是 Spring Boot 所做的,然后注册所有的 Servlet。剩下的就是好老春天了。 显然,Spring Boot 提供了大量的 AutoConfiguration 和属性来配置几乎所有内容!

    这是否有点帮助,也许你知道这一点并希望得到更多?

    【讨论】:

    • 感谢亚历克斯,您的回复。你当然有帮助,但我认为我的问题不够准确。我的意思是,“嵌入式 Tomcat 在哪个位置提取?”。普通的 Tomcat 存档在硬盘上需要大约 7-9mb,解压后需要 70-80。而且我不清楚嵌入式Tomcat从所使用的资源点提取的位置。在您的示例中,嵌入式 Tomcat 使用“java.io.tmpdir”作为它的上下文,但是在应用程序启动后,这个目录占用的磁盘空间非常少(~16kb)。
    猜你喜欢
    • 2022-06-10
    • 2016-04-28
    • 2021-06-24
    • 1970-01-01
    • 2015-06-21
    • 2010-11-25
    • 1970-01-01
    • 2011-09-15
    • 2016-07-27
    相关资源
    最近更新 更多