eclipse gradle打包_Spring Boot(十二):Spring Boot 如何测试打包部署

2023-11-06

部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA

密码:jsam

想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复“知乎”即可。


有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?

这篇文章就来介绍一下 Spring Boot 如何开发、调试、打包到最后的投产上线。

开发阶段

单元测试

在开发阶段的时候最重要的是单元测试了, Spring Boot 对单元测试的支持已经很完善了。

1、在 pom 包中添加 spring-boot-starter-test 包引用

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency> 

2、开发测试类

以最简单的 helloworld 为例,在测试类的类头部需要添加: @RunWith(SpringRunner.class)@SpringBootTest注解,在测试方法的顶端添加 @Test即可,最后在方法上点击右键run就可以运行。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

 @Test
 public void hello() {
 System.out.println("hello world");
 }

} 

实际使用中,可以按照项目的正常使用去注入数据层代码或者是 Service 层代码进行测试验证, spring-boot-starter-test 提供很多基础用法,更难得的是增加了对 Controller 层测试的支持。

//简单验证结果集是否正确
Assert.assertEquals(3, userMapper.getAll().size());

//验证结果集,提示
Assert.assertTrue("错误,正确的返回值为200", status == 200); 
Assert.assertFalse("错误,正确的返回值为200", status != 200); 

引入了 MockMvc支持了对 Controller 层的测试,简单示例如下:

public class HelloControlerTests {

 private MockMvc mvc;

 //初始化执行
 @Before
 public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
 }

 //验证controller是否正常响应并打印返回结果
 @Test
 public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
 .andExpect(MockMvcResultMatchers.status().isOk())
 .andDo(MockMvcResultHandlers.print())
 .andReturn();
 }

 //验证controller是否正常响应并判断返回结果是否正确
 @Test
 public void testHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
 .andExpect(status().isOk())
 .andExpect(content().string(equalTo("Hello World")));
 }

} 

单元测试是验证你代码第一道屏障,要养成每写一部分代码就进行单元测试的习惯,不要等到全部集成后再进行测试,集成后因为更关注整体运行效果,很容易遗漏掉代码底层的bug.

集成测试

整体开发完成之后进入集成测试, Spring Boot 项目的启动入口在 Application 类中,直接运行 run 方法就可以启动项目,但是在调试的过程中我们肯定需要不断的去调试代码,如果每修改一次代码就需要手动重启一次服务就很麻烦, Spring Boot 非常贴心的给出了热部署的支持,很方便在 Web 项目中调试使用。

pom 需要添加以下的配置:

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
 <optional>true</optional>
 </dependency>
</dependencies>

<build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <configuration>
 <fork>true</fork>
 </configuration>
 </plugin>
</plugins>
</build> 

添加以上配置后,项目就支持了热部署,非常方便集成测试。

投产上线

其实我觉得这个阶段,应该还是比较简单一般分为两种;一种是打包成 jar 包直接执行,另一种是打包成 war 包放到 tomcat 服务器下。

打成 jar 包

如果你使用的是 maven 来管理项目,执行以下命令既可以

cd 项目跟目录(和pom.xml同级)
mvn clean package
## 或者执行下面的命令
## 排除测试代码后进行打包
mvn clean package -Dmaven.test.skip=true 

打包完成后 jar 包会生成到 target 目录下,命名一般是 项目名+版本号.jar

启动 jar 包命令

java -jar  target/spring-boot-scheduler-1.0.0.jar

这种方式,只要控制台关闭,服务就不能访问了。下面我们使用在后台运行的方式来启动:

nohup java -jar target/spring-boot-scheduler-1.0.0.jar&

也可以在启动的时候选择读取不同的配置文件

java -jar app.jar --spring.profiles.active=dev

也可以在启动的时候设置 jvm 参数

java -Xms10m-Xmx80m-jar app.jar &

gradle

如果使用的是 gradle,使用下面命令打包

gradle build
java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar 

打成 war 包

打成 war 包一般可以分两种方式来实现,第一种可以通过 eclipse 这种开发工具来导出 war 包,另外一种是使用命令来完成,这里主要介绍后一种

1、maven 项目,修改 pom 包

<packaging>jar</packaging>

改为

<packaging>war</packaging>

2、打包时排除tomcat.

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
 <scope>provided</scope>
</dependency> 

在这里将 scope 属性设置为 provided,这样在最终形成的 WAR 中不会包含这个 JAR 包,因为 Tomcat 或 Jetty 等服务器在运行时将会提供相关的 API 类。

3、注册启动类

创建 ServletInitializer.java,继承 SpringBootServletInitializer ,覆盖 configure(),把启动类 Application 注册进去。外部 Web 应用服务器构建 Web Application Context 的时候,会把启动类添加进去。

public class ServletInitializer extends SpringBootServletInitializer {
 @Override
 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
 return application.sources(Application.class);
 }
} 

最后执行

mvn clean package-Dmaven.test.skip=true

会在 target 目录下生成:项目名+版本号.war文件,拷贝到 tomcat 服务器中启动即可。

gradle

如果使用的是 Gradle,基本步奏一样,build.gradle中 添加 war 的支持,排除 spring-boot-starter-tomcat:

...

apply plugin: 'war'

...

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE"){
        exclude mymodule:"spring-boot-starter-tomcat"
 }
}
... 

再使用构建命令

gradle build

war 会生成在 buildlibs 目录下。

生产运维

查看 JVM 参数的值

可以根据 Java 自带的 jinfo 命令:

jinfo -flags pid

来查看 jar 启动后使用的是什么 gc、新生代、老年代分批的内存都是多少,示例如下:

-XX:CICompilerCount=3-XX:InitialHeapSize=234881024-XX:MaxHeapSize=3743416320-XX:MaxNewSize=1247805440
-XX:MinHeapDeltaBytes=524288-XX:NewSize=78118912-XX:OldSize=156762112-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops-XX:+UseFastUnorderedTimeStamps-XX:+UseParallelGC
  • -XX:CICompilerCount :最大的并行编译数
  • -XX:InitialHeapSize-XX:MaxHeapSize :指定 JVM 的初始和最大堆内存大小
  • -XX:MaxNewSize : JVM 堆区域新生代内存的最大可分配大小
  • ...
  • -XX:+UseParallelGC :垃圾回收使用 Parallel 收集器

如何重启

简单粗暴

直接 kill 掉进程再次启动 jar 包

ps -ef|grep java 
##拿到对于Java程序的pid
kill -9 pid
## 再次重启
Java -jar  xxxx.jar 

当然这种方式比较传统和暴力,所以建议大家使用下面的方式来管理

脚本执行

如果使用的是maven,需要包含以下的配置

<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <configuration>
 <executable>true</executable>
 </configuration>
</plugin> 

如果使用是 gradle,需要包含下面配置

springBoot {
    executable = true
} 

启动方式:

1、 可以直接 ./yourapp.jar 来启动

2、注册为服务

也可以做一个软链接指向你的jar包并加入到 init.d中,然后用命令来启动。

init.d 例子:

ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
chmod +x /etc/init.d/yourapp 

这样就可以使用 stop或者是 restart命令去管理你的应用。

/etc/init.d/yourapp start|stop|restart

或者

service yourapp start|stop|restart

到此 Spring Boot 项目如何测试、联调和打包投产均已经介绍完,以后可以找时间研究一下

Spring Boot 的自动化运维,以及 Spring Boot 和 Docker 相结合的使用。

部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA

密码:jsam

想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复“知乎”即可。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

eclipse gradle打包_Spring Boot(十二):Spring Boot 如何测试打包部署 的相关文章

  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 警告功能默认情况下应该有一个蛇形标识符

    我试图弄清楚这个警告的实际含义 该程序运行完美 但在编译过程中我收到此警告 main rs 6 1 8 2 warning function isMultiple should have a snake case identifier wa
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备
  • Data-config.xml 和 mysql - 我只能加载“id”列

    我在 Windows Server 2012 上安装了 Solr 5 0 0 我想将表中的所有数据加载到 solr 引擎中 我的 data config xml 如下所示
  • Eclipse 有 IntelliJ Keymapping 插件吗?

    我是一位 IntelliJ 老用户 现在正在从事一个需要 Eclipse 的项目 我不介意学习 Eclipse 默认键盘快捷键 如果有 但是很多操作都没有分配快捷键 grrrr 我想知道是否有任何插件可以自动将 IntelliJ 默认值分配
  • Arduino 串行输出丢弃字符

    当我尝试为我的 Arduino Uno 编写一些代码时 我遇到了一个奇怪的串行输出 我有这个原始代码 MyClass myclass void setup Serial Begin 9600 Serial println Starting
  • 通过 jquery,设置为 html-select 元素的选项,通过文本而不是值选择属性

    我有一个选择元素
  • 在 C++11 中设置 std::thread 优先级的可移植方法

    在后 C 11 世界中设置 std thread 实例的优先级的正确方法是什么 是否有一种至少在 Windows 和 POSIX Linux 环境中有效的可移植方法 或者是获取句柄并使用可用于特定操作系统的任何本机调用的问题 无法通过 C
  • 如何找到数组中的最小数字并返回该数组的主索引?

    我有一个如下所示的数组 我想找到 diff 索引中数字最小的数组 所以在这种情况下 我想取回数组 7 我需要的只是数组编号 即 7 而不是任何其他信息 我知道我可以使用 array column 轻松找到最小的数字 但如何返回整个数组索引
  • 编辑 git patch 给出“您编辑的块不适用”

    我正在交互地添加一个文件 git add template panels panel reports php p diff git a template panels panel reports php b template panels
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存
  • pylint:忽略 rcfile 中的多个

    在我的 django 项目中 我使用的是外部编写的应用程序 但编写得很糟糕 现在我想从我的 pylint 报告中忽略这个应用程序 但是我无法让 pylint 忽略它 Pylint 已经忽略了南方的迁移 如下所示 MASTER ignore
  • Android ACTION_MOVE阈值

    我正在编写一个应用程序 需要使用手指或最终使用手写笔在屏幕上书写 我有那部分工作 在 ACTION DOWN 时 开始绘制 在 ACTION MOVE 上 添加线段 在 ACTION UP 上 完成该行 问题是 在 ACTION DOWN
  • Apollo 服务器,Graphql - 必须提供查询字符串

    我不确定我在这里做错了什么 我现在已经被困了一段时间 让我的突变在无服务器设置中与我的 apollo server lambda 一起运行 当我尝试运行这样的查询时 我的查询工作正常 mutation signIn username Som
  • 当应用程序在 Android 中首次启动时,仅显示一次消息对话框

    我在android中开发了一个应用程序 其中一个重要的要求是仅在应用程序第一次运行时显示语言支持的消息对话框 然后每次用户再次运行应用程序时它都会消失 我 我尝试过使用共享首选项 但没有成功 还有其他方法吗 在 onCreate 处理程序中
  • Encog:BasicNetwork:无需预先构建数据集的在线学习

    我正在尝试使用 encog 库作为强化学习问题的函数逼近器 更准确地说 我正在尝试启动并运行多层感知器 BasicNetwork 由于我的代理将根据我选择的任何 RL 算法以某种方式探索世界 因此我无法预先构建任何 BasicNeuralD
  • hibernate.cache.region.factory_class hibernate.cfg.xml 中必需

    我正在研究使用 memcache 作为 Hibernate 的二级缓存 我正在使用 hibernate memcached 1 2 4 spymemcached 2 8 0 和 hibernate 4 1 4 但是当我尝试使用它时 它给我错
  • Kotlin - 来自 KType 的 KClass<*>

    在 Kotlin 中 我可以获得KType from a KClass lt gt 像这样 Int class createType kotlin Int 我如何做相反的事情并获得KClass
  • 单元测试 HttpClientModule 时出错(Angular 4.3+)

    我正在探索新的 Angular HttpClientModule 并遇到莫名其妙的错误 该模块足够新 我还找不到任何有关如何进行单元测试的有用信息 并且官方文档没有任何示例 该应用程序包含一个具有一种方法的服务 该方法将 URL 传递给ht

随机推荐

  • 静默执行bat文件

    让bat隐藏运行需要用vbs文件才能实现 方式一 使用vbs文件 新建一个 文本文档后缀改为 vbs 可以这样写 set ws WScript CreateObject WScript Shell ws Run d yy bat 0 其中d
  • 《区块链技术与应用》学习笔记2——BTC数据结构

    Hash pointer 哈希指针 指针 在程序运行过程中 需要用到数据 最简单的是直接获取数据 但当数据本身较大 需要占用较大空间时 明显会造成一定麻烦 因此可以引用指针 每次获取相应的数据即可 实际使用中 指针实际上存储的是逻辑地址更多
  • C语言用scanf来判断键盘输入数据类型

    2 可以用来判断是否和定义的类型一致 如 int n if scanf d n 1 else 可以用来判断键盘输入的数据是否是整数
  • 打不开微软自带的软件,或者初次安装sql server 提示下载不了,版本不支持的,一定检查一下这里

    检查这里 这里一定要把代理模式关掉 血的教训啊
  • 吉首大学_编译原理实验题_基于预测方法的语法分析程序的设计【通过代码】

    一 实验要求 实验二 基于预测方法的语法分析程序的设计 一 实验目的 了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法 掌握预测语法分析程序的手工构造方法 二 实验内容 1 了解编译程序的基于预测方法的语法分析过程 2
  • GFS论文解读

    文章目录 1 设计概述 1 1 假设 1 2 GFS架构 1 3 读取流程 1 4 元数据 1 5 操作日志 1 6 一致性模型 2 系统交互 2 1 契约机制 2 2 数据写入过程 2 3 数据流 2 4 原子的记录追加 1 设计概述 1
  • Leetcode[链表] 反转链表 -- 双指针法

    0 题目描述 leetcode原题链接 反转链表 1 双指针法 定义两个指针 pre 和 cur pre 在前 cur 在后 每次让 pre 的 next 指向 cur 实现一次局部反转 局部反转完成之后 pre 和 cur 同时往前移动一
  • Kotlin 31. Kotlin 如何删除文件或文件夹

    Kotlin 如何删除文件或文件夹 比如 我们想要删除 Documents 年月日 文件夹下面的所有文件 包括这个文件夹 我们首先需要获得 Documents 的路径 val extDir File Environment getExter
  • ESP32——WIFI

    WiFi Wi Fi 库支持配置及监控 ESP32 Wi Fi 连网功能 WiFi工作模式 基站模式 即 STA 模式或 Wi Fi 客户端模式 此时 ESP32 连接到接入点 AP AP 模式 即 Soft AP 模式或接入点模式 此时基
  • 第二章 构造函数语意学 编译器何时合成拷贝构造函数?

    首先要清楚位拷贝 浅拷贝 和值拷贝 深拷贝 的区别 参考http blog sina com cn s blog a2aa00d70101gpvj html 位拷贝 及 bitwise copy 是指将一个对象的内存映像按位原封不动的复制给
  • STM32开发实例 基于STM32单片机的氛围灯

    一 系统设计 我想做的是个基于WIFI 的智能氛围灯 这个灯用app控制 首先这个灯在APP上面可以选择颜色 注 RGB 和亮度调节 音乐律动模式可跟随手机上播放的音乐改变亮度 光照模式白天关灯晚上开灯 人体感应模式有人时开灯反之关灯 智能
  • CSDN竞赛第45期题解

    CSDN竞赛第45期题解 1 题目名称 勾股数 勾股数是一组三个正整数 它们可以作为直角三角形的三条边 比如3 4 5就是一组勾股数 如果给出一组勾股数其中的 两个 你能找出余下的一个吗 ll a b cin gt gt a gt gt b
  • 图神经网络 PyTorch Geometric 入门教程

    简介 Graph Neural Networks 简称 GNN 称为图神经网络 是深度学习中近年来一个比较受关注的领域 近年来 GNN 在学术界受到的关注越来越多 与之相关的论文数量呈上升趋势 GNN 通过对信息的传递 转换和聚合实现特征的
  • php性能优化

    前言 在经历2 3年的时间 php程序员可以完成基本的功能性开发 但是这时候会有一个小瓶颈 就是不知道怎么去优化自己的代码 优化代码主要有两方面 1 php代码规范的优化 让自己代码变的更具可维护性 可读性更强 便于团队开发协作 这里就不作
  • 从char到QChar

    char类型是c c 中内置的类型 描述了1个字节的内存信息的解析 比如 char gemfield g 那么在由gemfield标记的这块内存的大小就是1个字节 信息就是01100111 8位 再比如 char gemfield 汉 那么
  • Java设计模式之观察者模式

    摘录 观察者模式是对象的行为模式 又叫发布 订阅 Publish Subscribe 模式 模型 视图 Model View 模式 源 监听器 Source Listener 模式或从属者 Dependents 模式 观察者模式定义了一种一
  • linux rfkill

    http blog csdn net eager7 article details 8121143
  • FFmpeg音视频播放器流程

    音视频播放器流程 ffmpeg解封装解码流程API ffmpeg官网 FFmpeg
  • [STM32]KEIL调试程序进入HardFault_Handler异常处理总结

    在做CORTEX M3单片机开发的时候 如STM32 可能会遇到设备跑着跑着程序死机的情况 往往调试起来很多时候发现是程序进入HardFault Handler系统异常 根据相关资料和M3权威指南是可以通过调试查找出程序的问题点和解决问题的
  • eclipse gradle打包_Spring Boot(十二):Spring Boot 如何测试打包部署

    部分面试资料链接 https pan baidu com s 1qDb2YoCopCHoQXH15jiLhA 密码 jsam 想获得全部面试必看资料 关注公众号 大家可以在公众号后台回复 知乎 即可 有很多网友会时不时的问我 Spring