springboot(二):通过jar或者war部署

一、打jar包部署
确认pom.xml中是<packaging>jar</packaging>
在pom.xml同级目录下,运行mvn package命令,在target目录下可查找到jar文件
运行java -jar .xxx.jar启动tomcat
ps:如果不知道打包后jar的位置,可打印完整的pom文件查看输出位置mvn help:effective-pom > pom.bak

二、打war包部署到tomcat
首先springboot去掉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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

改打包方式为war:<packaging>war</packaging>
因为不是jar无法从main函数开始,同时springboot没有web.xml文件也没法配置,所以依赖servlet特性写一个类继承SpringBootServletInitializer

/*修改启动类,继承SpringBootServletInitializer类并重写configure方法 */
public class SpringBootStartApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        //注意这里的参数要指向原先用main方法执行的Application启动类
        return builder.sources(SpringbootConfigApplication.class);
    }
}

注释中写到,如果SpringBootServletInitializer 专为部署war而用,如果不是war没必要使用这个类。
原理:
请看:

public class SpringServletContainerInitializer implements ServletContainerInitializer

ServletContainerInitializer实现类可以通过SPI机制spring-web-5.2.6.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer被servlet容器执行。

SpringServletContainerInitializer就是ServletContainerInitializer实现类,它实现了加载所有WebApplicationInitializer实现类

@Override
	public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
			throws ServletException {

		List<WebApplicationInitializer> initializers = new LinkedList<>();

		if (webAppInitializerClasses != null) {
			for (Class<?> waiClass : webAppInitializerClasses) {
				// Be defensive: Some servlet containers provide us with invalid classes,
				// no matter what @HandlesTypes says...
				if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
						WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
					try {
						initializers.add((WebApplicationInitializer)
								ReflectionUtils.accessibleConstructor(waiClass).newInstance());
					}
					catch (Throwable ex) {
						throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
					}
				}
			}
		}

	}

所以只要继承SpringBootServletInitializer,而SpringBootServletInitializer 是WebApplicationInitializer的实现类,环环相扣就执行到了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值