springboot的web項目的啓動主要分爲:java
一、IDEA中main函數啓動web
二、mvn springboot-run 命令spring
三、java -jar XXX.jarapache
關於Tomcat的屬性都在org.springframework.boot.autoconfigure.web.ServerProperties配置類中作了定義,咱們只需在application.properties配置屬性作配置便可。通用的Servlet容器配置都已」server」左右前綴,而Tomcat特有配置都以」server.tomcat」做爲前綴。下面舉一些經常使用的例子。api
#配置程序端口,默認爲8080 server.port= 8080 #用戶繪畫session過時時間,以秒爲單位 server.session.timeout= # 配置默認訪問路徑,默認爲/ server.context-path=
# 配置Tomcat編碼,默認爲UTF-8 server.tomcat.uri-encoding=UTF-8 # 配置最大線程數 server.tomcat.max-threads=1000
外部容器部署的話,就不能依賴於Application的main函數了,而是要以相似於web.xml文件配置的方式來啓動Spring應用上下文,此時咱們須要在啓動類中繼承SpringBootServletInitializer並實現configure方法:tomcat
package com.zjt.chapter05; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class Chapter05Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Chapter05Application.class); } public static void main(String[] args) { SpringApplication.run(Chapter05Application.class, args); } }
這個類的做用與在web.xml中配置負責初始化Spring應用上下文的監聽器做用相似,只不過在這裏不須要編寫額外的XML文件了。springboot
首先介紹下maven中scope依賴範圍的概念,由於後續涉及到這個會有問題。session
依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:app
compile:編譯依賴範圍。若是沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。典型的例子是spring-code,在編譯、測試和運行的時候都須要使用該依賴。webapp
test: 測試依賴範圍。使用次依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將沒法使用此依賴。典型的例子是Jnuit,它只有在編譯測試代碼及運行測試的時候才須要。
provided:已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在運行時候無效。典型的例子是servlet-api,編譯和測試項目的時候須要該依賴,但在運行項目的時候,因爲容器以及提供,就不須要Maven重複地引入一遍。
若是要將最終的打包形式改成war的話,還須要對pom.xml文件進行修改,由於spring-boot-starter-web中包含內嵌的tomcat容器,因此直接部署在外部容器會衝突報錯。這裏有兩種方法能夠解決,以下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
在這裏須要移除對嵌入式Tomcat的依賴,這樣打出的war包中,在lib目錄下才不會包含Tomcat相關的jar包,不然將會出現啓動錯誤。
還有一個很關鍵的關鍵點,就是tomcat-embed-jasper中scope必須是provided。
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>
由於SpringBootServletInitializer須要依賴 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有這個javax.servlet,若是沒用provided,最終打好的war裏面會有servlet-api這個jar,這樣就會跟tomcat自己的衝突了。這個關鍵點一樣適應於下面說的第二種方法。
直接添加以下配置便可:
<!--部署成war包時開啓↓↓↓↓--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--部署成war包時開啓↑↑↑↑-->
provided的做用上面已經介紹的很透徹了,這裏就不囉嗦了,這種方式的好處是,打包的war包同時適合java -jar命令啓動以及部署到外部容器中。
<packaging>war</packaging>
此時打成的包的名稱應該和application.properties的
server.context-path=/test
保持一致
<build> <finalName>test</finalName> </build>
若是不同發佈到tomcat的webapps下上下文會變化