- Unregistering JMX-exposed beans on shutdown
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
把scope刪掉就可以了。
- MainApplication.java必須位於某個包下
- 對springboot的依賴必須放在最前面!否則Springboot的內嵌tomcat無法啟動!
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ~[tomcat-embed-core-8.5.6.jar:8.5.6]
... 24 common frames omitted
- 在進行
mvn package
之前,最好mvn clean
一下,這樣就能夠刪除target目錄下的多余jar包。如果不刪除多余jar包,有可能會出錯。
比如我配置了mybatis,但是沒有設置datasource,這樣這個應用就啟動不了。而mybatis已經下載下來了,這時即便在pom中去掉mybatis,這時運行mvn package得到的war包中還是會包含mybatis,從而導致應用無法啟動。 - 初始化問題
一般情況下,部署在服務器上要使用tomcat,本地調試直接用SpringBoot自帶的tomcat
這就需要如下寫法
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
ServletInitializer是Servlet初始化器,意思是當本應用作為tomcat的一個webapp時,就調用configure函數,這是tomcat容器調用的,這時整個應用就相當於Servlet。
當作為SpringApplication運行時,會執行main函數,但是不會執行上面的configure函數。