springboot的打包方式依賴於插件:(下面插件打出的包與普通的包目錄結構有區別)
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
===================發布到獨立的Tomcat運行============
在開發階段我們推薦使用內嵌的tomcat進行開發,因為這樣會方便很多,但是到生成環境,我希望在獨立的tomcat容器中運行,因為我們需要對tomcat做額外的優化,這時我們需要將工程打包成war包發進行發布。
1. 工程的打包方式為war
2. 將spring-boot-starter-tomcat的范圍設置為provided
設置為provided是在打包時會將該包排除,因為要放到獨立的tomcat中運行,是不需要的。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
發現原來項目中沒有配置上面配置,因為我們配置了Springboot,具有依賴傳遞,因此自動加上上面的配置,我們需要手動配上覆蓋依賴傳遞的配置:
3. 修改代碼,設置啟動配置
需要繼承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); } }
4.打war包:
打包成功:
5. 部署到tomcat
- 第一種:將此項目作為默認項目的部署方式
(1)將war包解壓到webapps下的ROOT目錄中(將原來的ROOT文件夾下面的東西刪除掉),啟動:
WEB-INF下面 沒有web.xml
解釋:上面解壓后的文件沒有web.xml,但是仍能啟動。因為SpringConfig繼承了SpringBootServletInitializer,所以打包的時候spring-boot做了一系列初始化工作(如上面的org文件夾)。
(2)啟動測試:
- 第二種:將此項目類似於普通的項目進行部署,訪問需要加項目名稱
(1)將打出的war包復制到Tomcat安裝目錄下的webapps目錄下,並將war包重新命名為SSM.war,啟動Tomcat(Tomcat啟動的時候會自動掃描war包並解壓)
(2)啟動測試:
注意:
springboot項目方式不支持用Eclipse的export導出為war包然后部署到tomcat,因為這種Eclipse的Export打出的war包沒有帶springboot所做的初始化工作。打包的東西如下:
==============web項目打成jar包獨立運行===============
這種方式使用簡單,只需要安裝JDK環境即可使用。但是不利於tomcat的優化,而且一個項目對應一個內嵌的tomcat。
1.工程打包方式改為jar包
2. 將spring-boot-starter-tomcat的范圍設置為默認值compile
3.使用clean package命令打成jar包
4.采用java -jar的方式啟動測試:(這種方式啟動是不作為守護進程,窗口關閉即關掉此JVM)
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>
補充:pom.xml可以設置打成jar包的名字
<finalName>icc</finalName>