springboot的打包方式依賴於插件:(下面插件打出的包與普通的包目錄結構有區別)java
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
在開發階段咱們推薦使用內嵌的tomcat進行開發,由於這樣會方便不少,可是到生成環境,我但願在獨立的tomcat容器中運行,由於咱們須要對tomcat作額外的優化,這時咱們須要將工程打包成war包發進行發佈。web
設置爲provided是在打包時會將該包排除,由於要放到獨立的tomcat中運行,是不須要的。spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
發現原來項目中沒有配置上面配置,由於咱們配置了Springboot,具備依賴傳遞,所以自動加上上面的配置,咱們須要手動配上覆蓋依賴傳遞的配置:sql
須要繼承SpringBootServletInitializer,而後重寫configure,將Spring Boot的入口類設置進去。數據庫
package cn.qlq.config; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import com.jolbox.bonecp.BoneCPDataSource; /** * 發佈到獨立的Tomcat須要繼承SpringBootServletInitializer類並重寫configure方法 */ @Configuration // 經過該註解來代表該類是一個Spring的配置,至關於一個xml文件 @ComponentScan(basePackages = "cn.qlq") // 配置掃描包 @PropertySource(value = { "classpath:db.properties" }, ignoreResourceNotFound = true) public class SpringConfig extends SpringBootServletInitializer { @Value("${jdbc.url}") private String jdbcUrl; @Value("${jdbc.driverClassName}") private String jdbcDriverClassName; @Value("${jdbc.username}") private String jdbcUsername; @Value("${jdbc.password}") private String jdbcPassword; @Bean(destroyMethod = "close") public DataSource dataSource() { BoneCPDataSource boneCPDataSource = new BoneCPDataSource(); // 數據庫驅動 boneCPDataSource.setDriverClass(jdbcDriverClassName); // 相應驅動的jdbcUrl boneCPDataSource.setJdbcUrl(jdbcUrl); // 數據庫的用戶名 boneCPDataSource.setUsername(jdbcUsername); // 數據庫的密碼 boneCPDataSource.setPassword(jdbcPassword); // 檢查數據庫鏈接池中空閒鏈接的間隔時間,單位是分,默認值:240,若是要取消則設置爲0 boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60); // 鏈接池中未使用的連接最大存活時間,單位是分,默認值:60,若是要永遠存活設置爲0 boneCPDataSource.setIdleMaxAgeInMinutes(30); // 每一個分區最大的鏈接數 boneCPDataSource.setMaxConnectionsPerPartition(100); // 每一個分區最小的鏈接數 boneCPDataSource.setMinConnectionsPerPartition(5); return boneCPDataSource; } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // 設置啓動類,用於獨立tomcat運行的入口 return builder.sources(SpringConfig.class); } }
打包成功:tomcat
(1)將war包解壓到webapps下的ROOT目錄中(將原來的ROOT文件夾下面的東西刪除掉),啓動:springboot
WEB-INF下面 沒有web.xmlapp
解釋:上面解壓後的文件沒有web.xml,可是仍能啓動。由於SpringConfig繼承了SpringBootServletInitializer,因此打包的時候spring-boot作了一系列初始化工做(如上面的org文件夾)。webapp
(2)啓動測試:maven
(1)將打出的war包複製到Tomcat安裝目錄下的webapps目錄下,並將war包從新命名爲SSM.war,啓動Tomcat(Tomcat啓動的時候會自動掃描war包並解壓)
(2)啓動測試:
注意:
springboot項目方式不支持用Eclipse的export導出爲war包而後部署到tomcat,由於這種Eclipse的Export打出的war包沒有帶springboot所作的初始化工做。打包的東西以下:
這種方式使用簡單,只須要安裝JDK環境便可使用。可是不利於tomcat的優化,並且一個項目對應一個內嵌的tomcat。
java -jar ./springboot-ssm-0.0.1-SNAPSHOT.jar
測試:
補充:若是是IDEA中運行項目須要去掉provided,緣由是
這多是Intellij的一個bug,在使用spring-boot的時候,若是把某個引入的依賴設置爲provided,那麼在Intellij啓動時就會找不到相應的類。所以,此時須要把此項配置給註釋掉,可是打包上線的時候並不須要這些依賴,那麼在打包的時候就把註釋打開,便可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency>