背景
在 spring boot 出来之前,或者没有使用 spring boot 时,Java EE 开发时如果选择 tomcat servlet,需要自己指定 tomcat 版本;此处没有考虑那种直接把打包的 war 直接扔到本地安装的任意版本的 tomcat,然后启动外置 tomcat 的情况。
使用 spring boot (内置 tomcat)时,一般情况下,完全没有必要去修改 tomcat 的版本,就算是生产环境使用的 spring boot 内置版本,也是最好使用 spring boot 的内置的 tomcat 版本,这是经过兼容测试、回归测试的版本号。
但是,很多公司都不推荐各个应用使用内置 tomcat 这种方式,因为这样的话,100 个服务,可能有几十种版本的 tomcat,不方便统一管理,太老的 tomcat 版本有问题,太新的版本不稳定。所以很多公司仍然在使用经过很多公司多年生产环境校验的 tomcat 7,甚至是 tomcat 6。随着版本的提升,依赖于 tomcat 的良好架构设计,其后续版本的各种性能提升,对于 http 2的支持,难道你真的舍得不去尝试使用吗?
不过,本地开发时,完全可以随意使用最新版本的 tomcat,如果是使用 spring boot,并且是使用内置 tomcat 的话,直接使用最新版本的 sb 即可,因为每次 sb 升级,都会升级 tomcat 版本。但是最新版本 sb 可能有不兼容等问题,有些人可能不会去尝试使用。
如果不是使用 spring boot 内置 tomcat,而是想使用任意版本的 tomcat 呢?
如何知道当前使用的版本
方法1:借助于IDEA
比如我当前的 sb 版本是:
<parent> <groupId>org.springframework.boot
groupId> <artifactId>spring-boot-starter-parent
artifactId> <version>1.5.7.RELEASE
version>
parent>
借助于 IDE,查看 spring-boot-starter-tomcat 的 pom 文件:
<dependencies> <dependency> <groupId>org.apache.tomcat.embed
groupId> <artifactId>tomcat-embed-core
artifactId>
dependency> <dependency> <groupId>org.apache.tomcat.embed
groupId> <artifactId>tomcat-embed-el
artifactId>
dependency> <dependency> <groupId>org.apache.tomcat.embed
groupId> <artifactId>tomcat-embed-websocket
artifactId>
dependency>
dependencies>
方法2:没有IDE, 怎么知道版本信息?
修改内置的默认版本
2018-03-15 00:46:26.275 INFO 47112 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2018-03-15 00:46:26.282 INFO 47112 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2018-03-15 00:46:26.283 INFO 47112 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.30 2018-03-15 00:46:26.333 INFO 47112 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-03-15 00:46:26.333 INFO 47112 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1000 ms
但是,有时候启动会报错:
Caused by: java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory at org.apache.catalina.util.LifecycleBase.
(LifecycleBase.java:37) at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:169) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134) ... 13 common frames omitted
显然是缺少 jar 包,在 dependency 里面添加以下两者之一即可:
<dependency> <groupId>org.apache.tomcat
groupId> <artifactId>tomcat-juli
artifactId> <version>${tomcat.version}
version>
dependency>
如果项目是使用内嵌Tomcat servlet容器形式打包部署,推荐使用下面这个,其groupId和artifactId皆是embed类型的jar包。如果项目是以war包形式打包部署,即pom标签是war,则推荐使用上面这个。
<dependency> <groupId>org.apache.tomcat.embed
groupId> <artifactId>tomcat-embed-logging-juli
artifactId> <version>${tomcat.version}
version>
dependency>
<properties> <tomcat.version>8.0.30
tomcat.version>
properties>
<dependency> <groupId>org.apache.tomcat.embed
groupId> <artifactId>tomcat-embed-core
artifactId> <version>${tomcat.version}
version>
dependency>
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176852.html原文链接:https://javaforall.net
