spring boot2.0项目如何开发、调试、打包到最后的投产上线(一)

简介: 有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试、打包到最后的投产上线。  

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


有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发、调试、打包到最后的投产上线。

 

 开发阶段

 

 单元测试

 

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

 

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

 

org.springframework.boot
 spring-boot-starter-test
 test

  2、开发测试类

 

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

 

@RunWith(SpringRunner.class)
  @SpringBootTest
  public class ApplicationTests {
  @Test
  public void hello() {
  System.out.println("hello world");
  }
  }

 

 实际使用中,可以按照项目的正常使用去注入dao层代码或者是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(www.027yeshenghuowang.com/))
  .andDo(MockMvcResultHandlers.print())
  .andReturn();
  }
  //验证controller是否正常响应并判断返回结果是否正确
  @Test
  public void testHello() throws Exception {
  mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
  .andExpect(status().isOk(http://xucaizxyl.com/))
  .andExpect(content().string(equalTo("Hello World")http://www.wbjyl.cn/));
  }
  }

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

 

 集成测试

 

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

 

 pom需要添加以下的配置:

 

org.springframework.boot
 spring-boot-devtools
 true
 org.springframework.boot
 spring-boot-maven-plugin
 true

 

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

 

 投产上线

 

 其实我觉得这个阶段,应该还是比较简单一般分为两种;一种是打包成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

 

 gradle

 

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

 

 gradle build

 

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

 

 打成war包

 

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

 

 1、maven项目,修改pom包

 

 将 jar  改为 war

 

 2、打包时排除tomcat.

 

org.springframework.boot
 spring-boot-starter-web
 org.springframework.boot
 spring-boot-starter-tomcat
 provided

 在这里将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会生成在build\libs 目录下。

 

 生产运维

 

 查看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收集器


目录
相关文章
|
1天前
|
Java 应用服务中间件 Spring
【JavaEE】Spring Boot - 项目的创建和使用(下)
【JavaEE】Spring Boot - 项目的创建和使用
6 0
|
1天前
|
数据可视化 Java 应用服务中间件
【JavaEE】Spring Boot - 项目的创建和使用(上)
【JavaEE】Spring Boot - 项目的创建和使用
6 0
|
1天前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
12 4
|
1天前
|
消息中间件 JSON Java
RabbitMQ的springboot项目集成使用-01
RabbitMQ的springboot项目集成使用-01
|
1天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
56 0
|
1天前
|
Java
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
16 0
|
1天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
102 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
1天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
23 2
|
1天前
|
Java Spring
Spring boot项目如何发送邮件
Spring boot项目如何发送邮件
18 2
|
1天前
|
Java 数据库连接 数据库
Springboot整合mybatisPlus开发
MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发和提高效率。它在不修改原有MyBatis的基础上提供额外功能。要将MyBatis-Plus集成到SpringBoot项目中,首先通过Maven添加mybatis-plus-boot-starter和相应数据库驱动依赖,然后配置application.yml中的数据库连接信息,并指定Mapper类的扫描路径。Mapper接口可继承BaseMapper实现基本的CRUD操作。