title: Spring Boot + gradle环境搭建
abbrlink: 8c606925
Spring Boot + gradle环境搭建
文章目录
概述
本文详细记录了Spring Boot环境搭建的过程,包含生成基本的项目结构,设置热部署插件springloaded
,生成war包发布到外部的tomcat,编写一个测试的控制器。
1 生成基本的项目结构
1.1 使用Spring Initializr新建一个项目。
**注意:**这里Packaging
要选war
包,这个选项对自动生成的代码有影响,下面会说。
这里就算不勾选Web,由于之前选了打war包,也会生成web项目。
gradle推荐使用默认的,会自动下载,如果下载很慢的,那就选Use local gradle distribution
,指定自己本地的gradle路径。
1.2 gradle文件配置
创建完项目后,可能在右下角会看到这个提示
表示gradle文件已改变,是否需要导入新的依赖,这里我们点Enable Auto-Import
,这个选项的意思是只要你改动了build.gradle
文件,就会自动刷新依赖。
**注意:**下次重启Intellij可能会出现下图的提示
那就点Create Default Context
,创建默认的Context
此时的gradle文件内容如下:
buildscript {
ext {
springBootVersion = '1.5.4.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
configurations {
providedRuntime
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
}
我们前面Packaging
勾选war
产生的效果就是
1.增加了
apply plugin: 'war'
,war插件
2.providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
,表示代码在运行时需要的依赖,providedRuntime
是指依赖的Jar包不会被加到War包里面。
然后配置热部署,热部署是指一旦项目run起来,我们就不需要再次run了,只需要编译修改的文件或者编译整个工程,修改就会自动部署,是不是很方便?这里还是用spring的springloaded。
在buildscript
的dependencies
中加入:
classpath 'org.springframework:springloaded:1.2.7.RELEASE'
之后代码有修改只需要编译修改了的代码(单个文件:菜单栏build/recompile…,多个就要在左边的Project中选中修改的文件,右键,rebuild,或者直接整个工程重新编译)就行了。
1.3 工程目录配置
工程目录中,基本配置其实都自动生成好了,自动生成的文件目录如下图所示:
这里有两个类,HexiApplication
和ServletInitializer
。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(HexiApplication.class);
}
}
@SpringBootApplication
public class HexiApplication {
public static void main(String[] args) {
SpringApplication.run(HexiApplication.class, args);
}
}
Packaging
勾选war
还有一个效果就是会生成一个ServletInitializer。因为项目要部署到tomcat,启动类必须继承自SpringBootServletInitializer,主要起到web.xml的作用。
**注意:**这里我们解释下@SpringBootApplication
@SpringBootApplication
等价于@Configuration
、@EnableAutoConfiguration
、@ComponentScan
,查看SpringBootApplication注解可以发现@ComponentScan
并没有添加任何的参数,它会自动扫描工程里所有的@Component
,@Service
,@Repository
,@Controller
并把它们注册为Spring Beans。
2 控制器的编写
按如图所示包结构新建包和类。
HelloController
@RestController("/hello")
public class HelloController {
private HelloWorld helloWorld;
public HelloController(HelloWorld helloWorld) {
this.helloWorld = helloWorld;
}
@GetMapping
public String hello() {
return helloWorld.hello();
}
}
HelloWorld
@Component
public class HelloWorld {
public String hello() {
return "Hello World!";
}
}
这里我们的HelloWorld或HelloController都没有@AutoWired
注解(@Autowired
注释可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过@Autowired
的使用来消除set
,get
方法)。因为Spring的文档写到了如果只有一个构造函数,就可以省略这个注释。如果有多个,则要加上。
@RestController("/hello")
public class HelloController {
private HelloWorld helloWorld;
@AutoWired
public HelloController(HelloWorld helloWorld) {
this.helloWorld = helloWorld;
}
...
}
@AutoWired
会寻找和构造函数参数类型匹配的bean,把它们作为传入参数来创建HelloController
。
@Component
泛指组件,一般用于普通POJO,当组件不好归类的时候,也可以使用这个注解进行标注。
@Service
用于标注业务层组件
@RestController
用于标注控制层组件。@RestController
同时包含了@Controller
、@ResponseBody
。
@GetMapping
也是一个组合注解,相当于@RequestMapping(method = RequestMethod.GET)
的缩写。 类似的还有@PostMapping
、@PutMapping
、@DeleteMapping
。
3 运行应用
如图所示,打开右边的gradle,找到bootRun运行。跑起来后,下面的run工具窗口会一直显示在运行。此时打开浏览器,输入http://localhost:8080/hello
,就可以看到Hello World!
了。如果运行出错,则在Terminal工具窗口输入`./gradlew bootRun’看错误日志。
项目demo github地址:https://github.com/Jadyli/RetrofitClientServer
4 常见问题
4.1 Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
sync 后重试,一般是由于vpn之类的导致不能联网而sync失败。