springboot 最近火的不行,目前几乎已经是 spring 家族最耀眼的项目了。抛开微服务、技术社区这些推广因素不说,框架本身的确有非常多的优点。比如
作为一名老程序员来说,仍然需要保持一个积极学习的态度。
哎,简单点说就是少点伤感,认清现实。你曾经引以为傲的某某EE 技术已经被颠覆了,赶紧换车道 .....
废话不多说,以下内容主要讲的是怎么利用springboot 这个脚手架搭建一个最精简的项目。
其中几个模块会非常实用,这包括结构、配置、日志、部署..
springboot 项目仍然是使用maven 进行初始化及构建,下面是一个典型的结构:
大致看一下就行了,不了解maven的话,点击这里先学习入门,项目的构建工具是一定要先了解的。
可以通过eclipse 或idea 创建一个maven项目,再引入springboot依赖,pom文件的定义参考如下:
4.0.0
org.zales
dmo-boot
0.0.1-SNAPSHOT
UTF-8
1.5.1.RELEASE
1.8
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.boot
spring-boot-starter-web
${spring-boot.version}
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
${spring-boot.version}
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
org.springframework.boot
spring-boot-devtools
${spring-boot.version}
true
org.springframework.boot
spring-boot-starter-thymeleaf
${spring-boot.version}
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${project.build.sourceEncoding}
springboot 官方的示例是让你继承一个spring-boot-parent,但这个很鸡肋,通常的项目都会有自己的继承结构。
所以我们间接利用spring-boot-dependencies将所有依赖引入,其他模块的引入都是按需。
maven-compiler-plugin的定义用于将项目指定为Java1.8的编译级别。
其他途径
你还可以利用spring的在线网站初始化一个springboot项目,点击这里
启动代码非常简单,新建一个名为"DemoBoot**的类:
/**
* 入口类
*
*/
@SpringBootApplication
public class DemoBoot {
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(DemoBoot.class);
// 指定PID生成,默认输出到application.pid
app.addListeners(new ApplicationPidFileWriter());
app.run(args);
}
}
再创建一个DemoController类:
@Controller
public class DemoController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World! ";
}
}
至此,我们已经完成了框架代码!
热部署
我们在定义项目依赖时添加了springboot-devtools,该模块可以实现热部署的功能,即在开发过程中可以不重启应用令代码生效,非常方便
livereload 组件会定时扫描类路径下的class,一旦发现变更即重启服务,默认1000毫秒检测一次。
在定义依赖时指定optional 选项使得该模块仅在开发时启用。
livereload 在扫描会自动忽略以下范围的变更:
META-INF/maven/**
META-INF/resources/**
resources/**,static/**
public/**
templates/**
**/*Test.class
**/*Tests.class
git.properties
META-INF/build-info.properties
在src/main/resources/下新建一个application.properties文件,内容如下:
application.properties
server.address=0.0.0.0
server.port=8090
此时在IDE执行"DemoBoot",你应该可以看到一些描述程序启动的日志信息,访问本机的8090端口能看到"HelloWorld“输出。
application.properties可包含大量的配置,你可以在这里找到全部的配置
接下来需要为应用准备一个日志配置用于定制,springboot 默认是使用logback的,但由于更加熟悉log4j的缘故,我们选用了log4j2.x
在src/main/resources/下新建一个log4j2.xml文件,内容如下:
log4j2.xml
log
application
这里配置了两个日志记录方式,Console是控制台打印,RollingRandomAccessFile 指向一个日志文件,我们为该日志文件设定了滚动的规则:
应用最终需要发布到某个环境,那么我们怎么对springboot应用进行打包呢?
利用spring-boot-maven-plugin可以将springboot项目达成jar包。
随后执行java -jar xxx.jar的方式即可以启动应用。
这看起来好像很美好,但真实的项目发布并非这么简单。
为实现灵活的打包方式,我们需要同时引用spring-boot-maven-plugin和maven-assembly-plugin两个插件,如下:
pom.xml
org.springframework.boot
spring-boot-maven-plugin
repackage
org.apache.maven.plugins
maven-assembly-plugin
2.4
bundle
package
single
${basedir}/src/main/build/assembly.xml
plugin可以实现在maven的某个生命周期绑定一组动作,如上面的两个插件都绑定到了package阶段,执行顺序由声明的先后决定。
于是项目在执行mvn package这样的命令时,会先执行springboot插件的repackage动作,将程序打包成jar文件;随后通过assembly插件执行bundle任务,
再作最终的组装。
/src/main/build/assembly.xml定义了程序包的结构,如下:
bundle
tar.gz
false
${basedir}/src/main/build/config
application*.properties
log4j2.xml
0644
/
${basedir}/src/main/build/bin
*.sh
0755
/
${project.build.directory}
/
${project.artifactId}-${project.version}.jar
0755
assembly文件的定义比较简单,目标程序包中除了jar文件之外,还会包含几个脚本和配置文件。
nohup java -jar dmo-boot-0.0.1-SNAPSHOT.jar > console.log &
tail -n100 -f console.log
kill `cat application.pid`
rm application.pid
最终执行"mvn package"打包,会输出压缩包文件,结构如下:
dmo-boot.0.0.1-SNAPSHOT.jar
application.properties
log4j2.xml
start.sh
stop.sh
码云同步代码
本文将一个springboot项目从初始化、开发、配置、打包的整个流程进行了详细介绍,希望读者对该框架能产生整体性的了解。
由于篇幅有限,部分章节仅做了简单说明。springboot是一个优秀的脚手架,借助于框架可以快速的完成各种特性的实现。
在随后的文章里,将会跟大家一起继续深入学习,欢迎随时关注"美码师的补习系列-springboot篇"
作者:美码师