SpringBoot
项目在日常开发中是现在开发形式中的基础模式了、在构建、编码、测试、运行、打包、部署等一系列过程中、打包的方式就是其中一个非常重要的环节、SpringBoot
默认的打包方式是jar
但是在日常部署的方式中、我们需要根据不同的部署情况进行讲项目打成不成的包进行服务器部署、话又说来说、SpringBoot
内嵌了tomcat
但是打包方式确实jar
、所以在这里需要进行整理一下如何讲一个SpringBoot
项目打包成jar
或者war
进行项目发布部署。
1、前期准备工作
- 拥有 Java 开发环境以及相应 IDE
- 熟悉 Spring Boot
- 熟悉 Maven
- 掌握基本的打包部署能力
现有一张 User
表,其表结构如下:
id | name | age | |
---|---|---|---|
1 | Jone | 18 | test1@baomidou.com |
2 | Jack | 20 | test2@baomidou.com |
3 | Tom | 28 | test3@baomidou.com |
4 | Sandy | 21 | test4@baomidou.com |
5 | Billie | 24 | test5@baomidou.com |
其对应的数据库 Schema 脚本如下:
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
最终我们将初始化Springboot项目进行整合MybaitsPlus进行数据页面访问展示即可来演示打包。
访问方式:localhost:8080/list/all
2、jar
SpringBoot项目默认的打包方式就 jar包、所以我们无需作出更多的配置就可以很轻松的进行项目打包部署。
1、pom
修改
# 默认为jar、如果没有自行编写、默认不写
<packaging>jar</packaging>
# 修改最终打成jar包的包名
<build>
<!--指定打包名称-->
<finalName>springboot-jar-war</finalName>
</build>
2、新建maven打包
3、编写maven打包执行脚本(排除测试、关联项目)
3、执行打包
最终打成jar包的存放地:在target目录下
java -jar springboot-jar-war.jar
即可执行(springboot内嵌了tomcat)
3、war
springboot
打成war
运行在外部的tomcat或者服务中使用应该从以下思路开始
1、
springboot
内嵌了tomcat
、需要排除内部容器
2、启动类中
springboot启动通过main方法进入项目
外部容器部署需要告知项目的入口类加载
1、pom
修改
将springboot
默认打包方式修改为war
<!--打包方式-->
<packaging>war</packaging>
2、添加/排除依赖
因为程序在启动、编译的时候还是需要servlet的依赖、等生命周期应该在打包完成之前排除掉内嵌的tomcat
所以有两种方式、任选其中一项都是可以的(不可以两个同时存在)
##### 方式1:打包完成后直接排除内嵌Tomcat依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--打包排除内部的tomcat-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
##### 方式2:打包的时候可以不用包进去,外部提供、但是可以让参与测试编译等生命周期
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
相当于compile,但是打包阶段做了exclude操作-->
<scope>provided</scope>
</dependency>
3、修改启动项
继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer,实现configure方法:
SpringBootServletInitializer
源码解读
从上述源码注释中可以看出
方式1:
在
springboot
启动类中去继承SpringBootServletInitializer
并且重写configure
方法来指定项目的入口
@SpringBootApplication
@MapperScan("com.zkr.springbootjarwar.mapper")
public class SpringbootJarWarApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringbootJarWarApplication.class, args);
}
/**
* 继承SpringbootJarWarApplication 重写 configure
* 实现war外部程序主入口的指定
* @param builder
* @return
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootJarWarApplication.class);
}
}
方式2:
新增加一个类继承
SpringBootServletInitializer
实现configure
:
/**
* @author LiuGang
* @date 2021/2/23 - 17:23
* @Motto "何必余生、及时行乐、Good luck mi"
*/
public class Springbootjarwar extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//此处的Application.class为带有@SpringBootApplication注解的启动类
return builder.sources(SpringbootJarWarApplication.class);
}
}
- 更加推荐使用第一种!不要问经验所得
maven执行打包脚本生成war
4、部署外部容器
以Tomcat为例:
将war放入Tomcat的WebApps目录下
然后启动tomcat
访问成功:但是访问的时候需要添加包名才可以
注意事项:
使用外部Tomcat部署访问的时候,application.properties(或者application.yml)中配置的
server.port=
server.servlet.context-path=
将失效,请使用tomcat的端口,tomcat,webapps下项目名进行访问。
为了防止应用上下文所导致的项目访问资源加载不到的问题,
建议pom.xml文件中标签下添加最终的包名指定标签:
4、解决访问路径
我们将项目打成war包之后、可能在有些时候需要添加项目名称来访问、但有时候不需要、就想springboot中
application.ym
l中可以通过server.servlet.context-path=
来指定、那么外部的时候Tomcat也可以指定。并且修改端口
# path : / 表示不需要项目名
# docBase:项目路径 这里写相对路径、相对webapps、不要问我怎么知道的 appBase有指定
<Context path="/" docBase="项目地址路径" debug="0" />
5、端口修改
Tomcat默认为8080
可以在这里修改指定端口
6、总结
jar不需要修改任何配置、使用maven进行脚本打包即可
war:需要排除内部tomcat、或者添加编译测试运行等周期的servlet支持、在最终同样也排除了容器
springbootApplication
应用main类继承SpringBootServletInitializer
类实现configure
在进行项目打包即可!