springboot 嵌入式 tomcat 和 tomcat-embed-jasper

Posted

技术标签:

【中文标题】springboot 嵌入式 tomcat 和 tomcat-embed-jasper【英文标题】:springboot embedded tomcat and tomcat-embed-jasper 【发布时间】:2017-06-28 12:28:59 【问题描述】:

我有时会在 pom.xml 中看到以下声明...

   <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    ....

如你所见,spring-boot-starter-web 也被声明了 作为 tomcat-embed-jasper。

不是 spring-boot-starter-web 已经嵌入了 tomcat 了吗? 为什么有些开发人员仍然将 tomcat-embed-jasper 与 boot-starter-web 一起声明?还是有什么原因?

【问题讨论】:

【参考方案1】:

如您所说,spring-boot-starter-web 包括spring-boot-starter-tomcat。你可以检查一下here

spring-boot-starter-tomcat 包括tomcat-embed-core。你可以检查一下here

但是,tomcat-embed-core 似乎不包括 tomcat-embed-jasper。实际上,是 tomcat-embed-jasper 包含与 tomcat-embed-core 的依赖关系。检查它here

无论如何,tomcat-embed-jasper 被标记为provided,因此表明您希望 JDK 或容器在运行时提供依赖。此范围仅在编译和测试类路径上可用,并且不可传递。

综上所述,spring-boot-starter-web 包含 tomcat 嵌入依赖,但不包含 jasper 嵌入依赖,所以这应该是单独声明它的原因。

另外,请记住,使用 Spring IO Platform 作为父级可以轻松管理依赖项。要了解更多信息,请could read my post

希望对你有帮助,

【讨论】:

可能值得补充的是,开发人员添加 tomcat-embed-jasper 的原因(据我了解,这是问题的一部分)通常是他们希望他们的嵌入式 Tomcat 能够编译 jsp-文件。因为这就是贾斯珀所做的。 spring-boot-starter-web 不包括 tomcat-embed-jasper 所以必须单独声明。这也解释了依赖关系。嵌入式 Tomcat 不需要 jasper 即可工作,您仍然可以使用 servlet 或其他 Web 过滤器。但当然 jasper 需要一个容器来编译 jsp 文件。 感谢您的回答,但我遵循了您提到的层次结构,但对我来说“tomcat-embed-jasper”没有标记为“提供”。请帮助我理解这一点。提前致谢。 请注意,Spring Boot 建议避免将 JSP 作为模板引擎,尽管它支持它。有一些已知的 JSP 限制。请检查Spring Boot Template Engines 和JSP Limitations。 @AshishBurnwal 通过提供,他的意思是它在问题本身中被标记为提供。不在链接中提到的实际 pom 中。【参考方案2】:

延伸自 jcgarcia 的回答。

即使提供了,但是当你构建为 war 时,spring-boot-maven-plugin 将包含另外两个 jar : ecj-3.12.3.jar tomcat-embed-jasper-8.5.23.jar

【讨论】:

以上是关于springboot 嵌入式 tomcat 和 tomcat-embed-jasper的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot起飞系列-配置嵌入式Servlet容器

SpringBoot配置嵌入式的Servlet

SpringBoot嵌入式Tomcat的自动配置原理

Springboot: Tomcat很好我选Undertow

查看SpringBoot应用中的嵌入式tomcat的版本

spring boot 嵌入式Tomcat的崩溃日志在哪里?