技术文章

springboot项目打包成war用tomcat运行好还是打包成jar直接启动好?为何?

Spring Boot 为我们提供了两种打包的方式:jar 和 war,开发人员可以很方便地修改两种打包方式,那么打包成哪种方式启动比较好呢?

Jar

Spring Boo 默认的打包方式就是 jar,因为“约定优于配置”的原则,所以我们什么也不配置,打出来的包就是 jar 格式的,当然我们也可以在 pom.xml 中加上一行配置(我一般用 maven)。

<packaging>jar</packaging>

在 <build> 内配置打包的名称,就完成了打包的配置:

springboot

最后执行打包命令即可:

mvn clean package

打包完成后,在项目的 target 目录下会生成一个 jar 包,也就是我们打包好的项目代码了;Spring Boot 打成的 jar 包和普通的 jar 包还是有一定区别的,关键就在于Spring Boot 打成的 jar 包包含了自己所依赖的其他 jar 包,并且内置了容器,默认把 Tomcat 也打进了 jar 包(也可以换成 jetty、undertow),我们可以直接运行这个 jar 包。

War

要把代码打成 war 包要分成以下几个步骤:

1. 修改 pom.xml 文件中的配置,将打包方式 <packaging> 设置成 war;

2. 排除内置的 Tomcat 容器,也就是不要把 Tomcat 包进来了;

3. 修改入口方法,让启动类继承 SpringBootServletInitializer,并且覆盖 configure 方法;或者单独创建个类继承这个类也行。

springboot

如果采用了 war 包部署,项目中配置文件中的一些配置将失效,比如 port、servlet.context-path 等;打完的包我们可以部署在 Tomcat 或其他的 web 容器中。

Jar or War

首先表明,我是倾向于使用 jar 包部署的,我们项目也是这么做的。至于选择哪种部署方式,可以考虑这几点:

1.war 包不排除 Tomcat 容器直接打包,我们甚至可以通过 java -jar xxx.war 的方式启动,这种情况先不做考虑;打包成 jar 还是 war,主要讨论的是使用内置容器还是外置容器的问题;

2.如果项目中有使用 JSP,那么使用 war 包部署会更方便一些,虽然我们也可以通过配置集成 JSP 通过 jar 包方式运行;新项目的话就不要用 JSP 了;

3.如果公司用的 web 容器不是 Tomcat、Jetty 或 undertow,那就只能打成 war 包部署;

4.如果公司一直使用 Tomcat 部署,对于 Tomcat 本身的优化有一定的能力,有完善的脚本、工具什么的,可以考虑使用 war 包部署;

5.我比较倾向于 jar 包部署,使用 Spring Boot 的内置容器,还是因为这样做,可以屏蔽(部分)运行环境的差异,开发人员开发出来的代码,打包好部署在测试、生产环境,我们并不需要单位每个环境之间 Tomcat 的配置可能有所不同,导致我们的程序无法正常运行,这可以让我们的交付能力变强。

springboot

所以有可能的话,可以尝试使用 docker,上面说到的屏蔽(部分)运行环境的差异,就变成了屏蔽(绝大部分)运行环境的差异了。