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的主要内容,如果未能解决你的问题,请参考以下文章