springboot嵌入式tomcat和tomcat-embed-jasper

tut*_*ity 8 java tomcat spring-boot

我有时会在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>
    ....
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,spring-boot-starter-web被声明为tomcat-embed-jasper.

是不是spring-boot-starter-web已经有嵌入式tomcat?为什么有些开发人员仍然使用boot-starter-web声明tomcat-embed-jasper?或者有什么理由吗?

jcg*_*cia 8

如你所说,spring-boot-starter-web包括spring-boot-starter-tomcat.你可以在这里查看

spring-boot-starter-tomcat包括tomcat-embed-core.你可以在这里查看

但是,似乎tomcat-embed-core不包括在内tomcat-embed-jasper.事实上,是tomcat-embed-jasper谁包括依赖tomcat-embed-core.检查它在这里

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

总之,spring-boot-starter-web包括tomcat嵌入式依赖,但它不包括jasper嵌入式依赖,因此应该是单独声明它的原因.

另外,请记住,使用Spring IO Platform作为父级,您可以轻松地管理依赖项.要了解更多相关信息,您可以阅读我的帖子

希望能帮助到你,

  • 可能值得补充的是,开发人员添加`tomcat-embed-jasper`(在我的理解中是问题的一部分)的原因通常是他们希望他们的嵌入式Tomcat能够编译jsp文件.因为这就是碧玉所做的.`spring-boot-starter-web`不包含`tomcat-embed-jasper`,因此必须单独声明.这也解释了依赖关系.嵌入式Tomcat不需要jasper工作,您仍然可以使用servlet或其他Web过滤器.但是当然jasper需要一个容器来编译jsp文件. (7认同)
  • 请注意 Spring Boot 建议避免使用 JSP 作为模板引擎,尽管它支持它。有一些已知的 JSP 限制。请检查 [Spring Boot 模板引擎](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-template-engines) 和 [JSP 限制]( https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jsp-limitations)。 (4认同)