通常我们的Springboot项目都内嵌tomcat,只要照如下方式写好并运行启动类、便可运行成功。
@SpringBootApplication public class Application{ public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
但有时候我们会有些需求需要改变启动方式,如Tomcat启动方式,则需要让启动类extends自SpringBootServletIntiializer,并重写confidence方法
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
并设置嵌入式tomcat、添加<scope>provided</scope>,因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
<packaging>war</packaging>
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>8.0.36</version> <scope>provided</scope> </dependency>
注意:
如果再次使用springboot启动项目时、修改回启动类启动时会报如下错误:
java.lang.NoClassDefFoundError: javax/servlet/ServletContext
at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_101]
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_101]
at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_101]
原来是pom.xml忘了修改
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
因为<scope>provided</scope> 会使boot启动时不加载嵌入式tomcat,
去掉上面的依赖启动项目便可完美运行