SpringBoot的热部署、Velocity的使用与IDEA搭配

摘要:配置SpringBoot的Maven插件,使SpringBoot项目有热部署功能。与IDEA搭配实现SpringBoot项目自动编译后热部署,并且初步使用Velocity操作。

一、在SpringBoot使用热部署

1.1 SpringBoot pom.xml配置

 在我们开发过程中,我们需要经常修改,为了避免重复启动项目,我们可以启用热部署。
 Spring-Loaded项目提供了强大的热部署功能,添加/删除/修改 方法/字段/接口/枚举 等代码的时候都可以热部署,速度很快,很方便。
 当然,它也有一些小缺限:

  • 对于一些第三方框架的注解的修改,不能自动加载,比如:SpringMVC的@RequestMapping
  • log4j的配置文件的修改不能即时生效。

 想在Spring Boot中使用该功能非常简单,就是在spring-boot-maven-plugin插件下面添加依赖:

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>

 添加以后,通过mvn spring-boot:run启动就支持热部署了。
 注意:使用热部署的时候,需要IDE编译类后才能生效,你可以打开自动编译功能,这样在你保存修改的时候,类就自动重新加载了。
 通过在IDEA下面的终端中运行mvn spring-boot:run命令:
Alt text
 如果出现:

[INFO] Attaching agents: [**/1.2.5.RELEASE/springloaded-1.2.5.RELEASE.jar]

 说明你的Spring-loaded插件已经加载完毕,能够使用。

1.2 设置IDEA编译行为

 在IDEA中,编译代码的快捷键是Ctrl+Shift+F9,在Mac OS X上为Command+Sshift+F9
 这边使用IDEA中的Macros方式来实现保存即编译的过程,方式如下:

    1. Edit -> Macros -> Start Macro Recording
    1. Click File -> Save All(或者Command/Ctrl+S)
    1. Build -> Compile(或者Command/Ctrl+Sshift+F9)
    1. Edit -> Macros -> Stop Macro Recording

 保存Macros,名为:Save&Compile
 打开KeyMap,将原先的Save+all快捷键Command/Ctrl+S移除
Alt text
 在Keymap中找到Macros文件夹下的Save&Compile快捷键,将其设置为Command/Ctrl+S即可。
Alt text

二、SpringBoot与Velocity整合

2.1 配置pom.xml

只需在pom.xml文件中加入一下xml即可(如果之前使用IDEA创建SpringBoot项目时有选择Templates中的Velocity,则该步骤可省略)

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
</dependency>

2.2 测试Velocity

在resourse/templates目录下新建velocity文件,如下图所示:
Alt text
测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* TestVelocity
* Created by huangguoxin on 16/6/3.
*/

@Controller
@RequestMapping("/VelocityTest")
public class VelocityTest {

@RequestMapping("/VelocityTest")
public String helloVelocity(Map<String,Object> model){
//将数据存放map里面,可以直接在velocity页面,使用key访问
List<String> l= new ArrayList();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
l.add("5");
l.add("6");
//将数据存放map里面,可以直接在velocity页面,使用key访问
model.put("data",l);

return "/templates/hello";//也可以写成return "hello"
}
}

2.3 出错注意点

  1. 如果使用@RestController注解实现这个Contrller的话,返回的Json格式的数据,而不经过Velocity,无法输出你想要的数据。
  2. 配置application.properties,如下
1
2
3
4
5
6
7
spring.velocity.resourceLoaderPath=classpath:/templates/
spring.velocity.prefix=
spring.velocity.suffix=.vm
spring.velocity.cache=false
spring.velocity.check-template-location=true
spring.velocity.charset=UTF-
spring.velocity.content-type=text/html

三、使用Velocity布局模版

在SpringBoot中使用Velocity模版,需要生成一个名为velocityViewResolver的Bean,并将其配置,才能在SpringBoot中使用布局模版。
一下内容摘自SpringBoot官网SpringBootDocs

By default, Spring Boot configures a VelocityViewResolver. If you need a VelocityLayoutViewResolver instead, you can easily configure your own by creating a bean with name velocityViewResolver. You can also inject the VelocityProperties instance to apply the base defaults to your custom view resolver.
The following example replaces the auto-configured velocity view resolver with a VelocityLayoutViewResolver defining a customized layoutUrl and all settings that would have been applied from the auto-configuration:

1
2
3
4
5
6
7
@Bean(name = "velocityViewResolver")
public VelocityLayoutViewResolver velocityViewResolver(VelocityProperties properties) {
VelocityLayoutViewResolver resolver = new VelocityLayoutViewResolver();
properties.applyToViewResolver(resolver);
resolver.setLayoutUrl("layout/default.vm");
return resolver;
}

通过配置该Bean就能使用Velocity Layout模版,以下是我自己的Config

1
2
3
4
5
6
7
8
9
10
@Configuration
public class VelocityConfig {
@Bean(name = "velocityViewResolver")
public VelocityLayoutViewResolver velocityViewResolver(VelocityProperties velocityProperties) {
VelocityLayoutViewResolver resolver = new VelocityLayoutViewResolver();
velocityProperties.applyToViewResolver(resolver);
resolver.setLayoutUrl("layout/default.vm");
return resolver;
}
}