2017-02-10 93 views
2

我有时会看到在pom.xml中这些声明如下...springboot嵌入式Tomcat和Tomcat的嵌入,碧玉

<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> 
    .... 

,你可以看到,springboot起动器的Web宣布以及 为Tomcat的嵌入-碧玉。

是不是它spring-boot-starter-web已经有一个嵌入式的tomcat?为什么有些开发者仍然声明tomcat-embed-jasper和boot-starter-web?或者有什么理由?

回答

2

如您所说,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

希望它能帮助,

+0

知道了!,也感谢链接。 –

+1

可能值得补充的是,开发人员添加'tomcat-embed-jasper'的原因通常是他们希望他们的嵌入式Tomcat能够编译jsp文件。因为这就是碧玉所做的。 'spring-boot-starter-web'不包含'tomcat-embed-jasper',因此必须单独声明。 这也解释了依赖关系。嵌入式的Tomcat不需要jasper工作,你仍然可以使用servlet或其他web过滤器。但当然,Jasper需要一个容器来编译jsp文件。 – Fencer

+0

谢谢你的回答,但我遵循你提到的层次结构,但对我来说,“tomcat-embed-jasper”没有标记“提供”。请帮助我理解这一点。提前致谢。 –

0

从jcgarcia的答案扩展。

即使它提供了,但是当你建立战争,弹簧引导Maven的插件将包括两个罐子: ECJ-3.12.3.jar Tomcat的嵌入,碧玉8.5.23.jar