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>