<p>前言</p><p>springboot 最近火的不行,目前几乎已经是 spring 家族最耀眼的项目了。抛开微服务、技术社区这些推广因素不说,框架本身的确有非常多的优点。比如</p><p><ul><li>更简化的配置,摒除了许多繁杂的xml配置(事实证明,越简单的东西越容易让人记住);</li><li>内置Servlet容器,不再依赖外部环境</li><li>大量的starter模块,随手拈来</li><li>支持热部署</li></ul></p><p>作为一名老程序员来说,仍然需要保持一个积极学习的态度。哎,简单点说就是少点伤感,认清现实。你曾经引以为傲的某某EE 技术已经被颠覆了,赶紧换车道 .....</p><p>废话不多说,以下内容主要讲的是怎么利用springboot 这个脚手架搭建一个最精简的项目。其中几个模块会非常实用,这包括结构、配置、日志、部署..</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2020%2F0211%2F9dj00q5jjhx000td000dw008kp.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>一、基础结构</p><p>springboot 项目仍然是使用maven 进行初始化及构建,下面是一个典型的结构:</p><p>目录/文件</p><p>说明</p><p>pom.xml</p><p>依赖文件</p><p>src/main/java</p><p>代码目录</p><p>src/main/resources</p><p>配置目录,包含application.properties、log4j2.xml</p><p>src/main/build</p><p>定义构建文件目录</p><p>src/test/java</p><p>测试代码</p><p>src/test/resources</p><p>测试配置</p><p>大致看一下就行了,不了解maven的话,点击这里先学习入门,项目的构建工具是一定要先了解的。可以通过eclipse 或idea 创建一个maven项目,再引入springboot依赖,pom文件的定义参考如下:</p><p><ol><li></p><p>1. xml version="1.0"?></p><p></li><li></p><p>2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</p><p></li><li></p><p>3. xmlns="http://maven.apache.org/POM/4.0.0"</p><p></li><li></p><p>4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></p><p></li><li></p><p>5. 4.0.0</p><p></li><li></p><p>6. org.zales</p><p></li><li></p><p>7. dmo-boot</p><p></li><li></p><p>8. 0.0.1-SNAPSHOT</p><p></li><li></p><p>9. </p><p></li><li></p><p>10. UTF-8</p><p></li><li></p><p>11. 1.5.1.RELEASE</p><p></li><li></p><p>12. 1.8</p><p></li><li></p><p>13. </p><p></li><li></p><p>14. </p><p></li><li></p><p>15. </p><p></li><li></p><p>16. </p><p></li><li></p><p>17. org.springframework.boot</p><p></li><li></p><p>18. spring-boot-dependencies</p><p></li><li></p><p>19. ${spring-boot.version}</p><p></li><li></p><p>20. pom</p><p></li><li></p><p>21. import</p><p></li><li></p><p>22. </p><p></li><li></p><p>23. </p><p></li><li></p><p>24. </p><p></li><li></p><p>25. org.springframework.boot</p><p></li><li></p><p>26. spring-boot-starter-web</p><p></li><li></p><p>27. ${spring-boot.version}</p><p></li><li></p><p>28. </p><p></li><li></p><p>29. </p><p></li><li></p><p>30. </p><p></li><li></p><p>31. org.springframework.boot</p><p></li><li></p><p>32. spring-boot-starter-logging</p><p></li><li></p><p>33. </p><p></li><li></p><p>34. </p><p></li><li></p><p>35. </p><p></li><li></p><p>36. </p><p></li><li></p><p>37. </p><p></li><li></p><p>38. org.springframework.boot</p><p></li><li></p><p>39. spring-boot-starter-log4j2</p><p></li><li></p><p>40. ${spring-boot.version}</p><p></li><li></p><p>41. </p><p></li><li></p><p>42. </p><p></li><li></p><p>43. </p><p></li><li></p><p>44. org.springframework.boot</p><p></li><li></p><p>45. spring-boot-starter-test</p><p></li><li></p><p>46. ${spring-boot.version}</p><p></li><li></p><p>47. </p><p></li><li></p><p>48. </p><p></li><li></p><p>49. </p><p></li><li></p><p>50. org.springframework.boot</p><p></li><li></p><p>51. spring-boot-devtools</p><p></li><li></p><p>52. ${spring-boot.version}</p><p></li><li></p><p>53. true</p><p></li><li></p><p>54. </p><p></li><li></p><p>55. </p><p></li><li></p><p>56. </p><p></li><li></p><p>57. org.springframework.boot</p><p></li><li></p><p>58. spring-boot-starter-thymeleaf</p><p></li><li></p><p>59. ${spring-boot.version}</p><p></li><li></p><p>60. </p><p></li><li></p><p>61. </p><p></li><li></p><p>62. </p><p></li><li></p><p>63. </p><p></li><li></p><p>64. </p><p></li><li></p><p>65. org.apache.maven.plugins</p><p></li><li></p><p>66. maven-compiler-plugin</p><p></li><li></p><p>67. </p><p></li><li></p><p>68. ${java.version}</p><p></li><li></p><p>69. ${java.version}</p><p></li><li></p><p>70. ${project.build.sourceEncoding}</p><p></li><li></p><p>71. </p><p></li><li></p><p>72. </p><p></li><li></p><p>73. </p><p></li><li></p><p>74. </p><p></li></ol></p><p>springboot 官方的示例是让你继承一个spring-boot-parent,但这个很鸡肋,通常的项目都会有自己的继承结构。所以我们间接利用spring-boot-dependencies将所有依赖引入,其他模块的引入都是按需。<strong>maven-compiler-plugin</strong>的定义用于将项目指定为Java1.8的编译级别。</p><p><strong>其他途径</strong>你还可以利用spring的在线网站初始化一个springboot项目,点击这里</p><p>二、添加代码</p><p>启动代码非常简单,新建一个名为"DemoBoot的类:</p><p><ol><li></p><p>1. /</p><p></li><li></p><p>2. * 入口类</p><p></li><li></p><p>3. *</p><p></li><li></p><p>4. */</p><p></li><li></p><p>5. @SpringBootApplication</p><p></li><li></p><p>6. public class DemoBoot {</p><p></li><li></p><p>7. public static void main(String[] args) throws Exception {</p><p></li><li></p><p>8. SpringApplication app = new SpringApplication(DemoBoot.class);</p><p></li><li></p><p>9. // 指定PID生成,默认输出到application.pid</p><p></li><li></p><p>10. app.addListeners(new ApplicationPidFileWriter());</p><p></li><li></p><p>11. app.run(args);</p><p></li><li></p><p>12. }</p><p></li><li></p><p>13. }</p><p></li></ol></p><p>再创建一个<strong>DemoController</strong>类:</p><p><ol><li></p><p>1. @Controller</p><p></li><li></p><p>2. public class DemoController {</p><p></li><li></p><p>3. @RequestMapping("/")</p><p></li><li></p><p>4. @ResponseBody</p><p></li><li></p><p>5. String home() {</p><p></li><li></p><p>6. return "Hello World! ";</p><p></li><li></p><p>7. }</p><p></li><li></p><p>8. }</p><p></li></ol></p><p>至此,我们已经完成了框架代码!</p><p><strong>热部署</strong>我们在定义项目依赖时添加了springboot-devtools,该模块可以实现热部署的功能,即在开发过程中可以不重启应用令代码生效,非常方便 livereload 组件会定时扫描类路径下的class,一旦发现变更即重启服务,默认1000毫秒检测一次。在定义依赖时指定optional 选项使得该模块仅在开发时启用。livereload 在扫描会自动忽略以下范围的变更:</p><p><ol><li></p><p>1. META-INF/maven/</p><p></li><li></p><p>2. META-INF/resources/</p><p></li><li></p><p>3. resources/,static/</p><p></li><li></p><p>4. public/</p><p></li><li></p><p>5. templates/</p><p></li><li></p><p>6. /*Test.class</p><p></li><li></p><p>7. /*Tests.class</p><p></li><li></p><p>8. git.properties</p><p></li><li></p><p>9. META-INF/build-info.properties</p><p></li></ol></p><p>三、应用配置</p><p>在src/main/resources/下新建一个application.properties文件,内容如下:<strong>application.properties</strong></p><p><ol><li></p><p>1. server.address=0.0.0.0</p><p></li><li></p><p>2. server.port=8090</p><p></li></ol></p><p>参数名称</p><p>参数说明</p><p>server.address</p><p>监听地址,不配置或0.0.0.0即不限制</p><p>server.port</p><p>监听端口</p><p>此时在IDE执行"DemoBoot",你应该可以看到一些描述程序启动的日志信息,访问本机的8090端口能看到"HelloWorld“输出。</p><p>application.properties可包含大量的配置,你可以在这里找到全部的配置</p><p>四、日志配置</p><p>接下来需要为应用准备一个日志配置用于定制,springboot 默认是使用logback的,但由于更加熟悉log4j的缘故,我们选用了log4j2.x 在src/main/resources/下新建一个log4j2.xml文件,内容如下:</p><p><strong>log4j2.xml</strong></p><p><ol><li></p><p>1. xml version="1.0" encoding="UTF-8"?></p><p></li><li></p><p>2. status="INFO" monitorInterval="300"> </p><p></li><li></p><p>3. </p><p></li><li></p><p>4. </p><p></li><li></p><p>5. name="LOG_ROOT">log </p><p></li><li></p><p>6. </p><p></li><li></p><p>7. name="FILE_NAME">application </p><p></li><li></p><p>8. </p><p></li><li></p><p>9. </p><p></li><li></p><p>10. </p><p></li><li></p><p>11. name="Console" target="SYSTEM_OUT"> </p><p></li><li></p><p>12. </p><p></li><li></p><p>13. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}–[%t] %-5level -%l - %msg%n" /> </p><p></li><li></p><p>14. </p><p></li><li></p><p>15. </p><p></li><li></p><p>16. name="MainFile" </p><p></li><li></p><p>17. fileName="${LOG_ROOT}/${FILE_NAME}.log" </p><p></li><li></p><p>18. filePattern="${LOG_ROOT}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH}-%i.log"> </p><p></li><li></p><p>19. </p><p></li><li></p><p>20. </p><p></li><li></p><p>21. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}–[%t] %-5level -%l - %msg%n" /> </p><p></li><li></p><p>22. </p><p></li><li></p><p>23. </p><p></li><li></p><p>24. interval="1" /> </p><p></li><li></p><p>25. </p><p></li><li></p><p>26. size="50 MB" /> </p><p></li><li></p><p>27. </p><p></li><li></p><p>28. </p><p></li><li></p><p>29. max="20" /> </p><p></li><li></p><p>30. </p><p></li><li></p><p>31. </p><p></li><li></p><p>32. </p><p></li><li></p><p>33. </p><p></li><li></p><p>34. name="org.zales" level="info" additivity="true"> </p><p></li><li></p><p>35. </p><p></li><li></p><p>36. ref="MainFile" /> </p><p></li><li></p><p>37. </p><p></li><li></p><p>38. </p><p></li><li></p><p>39. level="info"> </p><p></li><li></p><p>40. </p><p></li><li></p><p>41. ref="Console" /> </p><p></li><li></p><p>42. </p><p></li><li></p><p>43. ref="MainFile" /> </p><p></li><li></p><p>44. </p><p></li><li></p><p>45. </p><p></li><li></p><p>46. </p><p></li></ol></p><p>这里配置了两个日志记录方式,Console是控制台打印,RollingRandomAccessFile 指向一个日志文件,我们为该日志文件设定了滚动的规则:</p><p><ol><li></p><p>1. 当大小超过50M时会生成新的日志;</p><p></li><li></p><p>2. 每小时生成一个新的日志; <strong>*DefaultRolloverStrategy max="20" *</strong> 指定了最多存在20个日志文件。之后,我们为主模块(这里是org.zales,你可以定义自己的包名)和ROOT都分别做了关联和日志级别定义。关于log4j2的用法,可以参考这个文章</p><p></li></ol></p><p>五、打包部署</p><p>应用最终需要发布到某个环境,那么我们怎么对springboot应用进行打包呢?利用spring-boot-maven-plugin可以将springboot项目达成jar包。随后执行<strong>java -jar xxx.jar</strong>的方式即可以启动应用。这看起来好像很美好,但真实的项目发布并非这么简单。</p><p><ul><li>首先是配置,springboot的maven插件会将所有配置文件都打进jar包内,而某些配置可能与环境相关。比如应用端口,安全证书、或是日志配置等,这时我们希望在jar包外部存放这些文件;</li><li>其次是执行脚本,在云环境上发布应用,通常需要提供启停脚本,包括一些监控功能脚本,这些需要作为项目打包的一部分</li><li>最后,将应用程序发布为tgz或zip格式的压缩包会更加灵活,你可以添加更多的东西。</li></ul></p><p>为实现灵活的打包方式,我们需要同时引用spring-boot-maven-plugin和maven-assembly-plugin两个插件,如下:<strong>pom.xml</strong></p><p><ol><li></p><p>1. </p><p></li><li></p><p>2. </p><p></li><li></p><p>3. </p><p></li><li></p><p>4. org.springframework.boot</p><p></li><li></p><p>5. spring-boot-maven-plugin</p><p></li><li></p><p>6. </p><p></li><li></p><p>7. </p><p></li><li></p><p>8. </p><p></li><li></p><p>9. repackage</p><p></li><li></p><p>10. </p><p></li><li></p><p>11. </p><p></li><li></p><p>12. </p><p></li><li></p><p>13. </p><p></li><li></p><p>14. </p><p></li><li></p><p>15. </p><p></li><li></p><p>16. org.apache.maven.plugins</p><p></li><li></p><p>17. maven-assembly-plugin</p><p></li><li></p><p>18. 2.4</p><p></li><li></p><p>19. </p><p></li><li></p><p>20. </p><p></li><li></p><p>21. bundle</p><p></li><li></p><p>22. package</p><p></li><li></p><p>23. </p><p></li><li></p><p>24. single</p><p></li><li></p><p>25. </p><p></li><li></p><p>26. </p><p></li><li></p><p>27. </p><p></li><li></p><p>28. ${basedir}/src/main/build/assembly.xml</p><p></li><li></p><p>29. </p><p></li><li></p><p>30. </p><p></li><li></p><p>31. </p><p></li><li></p><p>32. </p><p></li><li></p><p>33. </p><p></li><li></p><p>34. </p><p></li><li></p><p>35. </p><p></li></ol></p><p>plugin可以实现在maven的某个生命周期绑定一组动作,如上面的两个插件都绑定到了package阶段,执行顺序由声明的先后决定。于是项目在执行<strong>mvn package</strong>这样的命令时,会先执行springboot插件的repackage动作,将程序打包成jar文件;随后通过assembly插件执行bundle任务, 再作最终的组装。<strong>/src/main/build/assembly.xml</strong>定义了程序包的结构,如下:</p><p><ol><li></p><p>1. xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"</p><p></li><li></p><p>2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p><p></li><li></p><p>3. xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"></p><p></li><li></p><p>4. bundle</p><p></li><li></p><p>5. </p><p></li><li></p><p>6. tar.gz</p><p></li><li></p><p>7. </p><p></li><li></p><p>8. false</p><p></li><li></p><p>9. </p><p></li><li></p><p>10. </p><p></li><li></p><p>11. </p><p></li><li></p><p>12. ${basedir}/src/main/build/config </p><p></li><li></p><p>13. </p><p></li><li></p><p>14. </p><p></li><li></p><p>15. application*.properties</p><p></li><li></p><p>16. log4j2.xml</p><p></li><li></p><p>17. </p><p></li><li></p><p>18. 0644</p><p></li><li></p><p>19. / </p><p></li><li></p><p>20. </p><p></li><li></p><p>21. </p><p></li><li></p><p>22. </p><p></li><li></p><p>23. ${basedir}/src/main/build/bin</p><p></li><li></p><p>24. </p><p></li><li></p><p>25. *.sh</p><p></li><li></p><p>26. </p><p></li><li></p><p>27. 0755</p><p></li><li></p><p>28. /</p><p></li><li></p><p>29. </p><p></li><li></p><p>30. </p><p></li><li></p><p>31. </p><p></li><li></p><p>32. ${project.build.directory}</p><p></li><li></p><p>33. /</p><p></li><li></p><p>34. </p><p></li><li></p><p>35. ${project.artifactId}-${project.version}.jar</p><p></li><li></p><p>36. </p><p></li><li></p><p>37. 0755</p><p></li><li></p><p>38. </p><p></li><li></p><p>39. </p><p></li></ol></p><p>assembly文件的定义比较简单,目标程序包中除了jar文件之外,还会包含几个脚本和配置文件。</p><p><ul><li>启动脚本 <strong>/src/main/build/bin/start.sh</strong></li></ul><ol><li></p><p>1. nohup java -jar dmo-boot-0.0.1-SNAPSHOT.jar > console.log &</p><p></li><li></p><p>2. tail -n100 -f console.log</p><p></li></ol><ul><li>停止脚本 <strong>/src/main/build/bin/stop.sh</strong></li></ul><ol><li></p><p>1. kill `cat application.pid`</p><p></li><li></p><p>2. rm application.pid</p><p></li></ol><ul><li>配置文件 <strong>/src/main/build/application.properties</strong> <strong>/src/main/build/log4j2.xml</strong></li></ul></p><p>最终执行"mvn package"打包,会输出压缩包文件,结构如下:</p><p><ol><li></p><p>1. dmo-boot.0.0.1-SNAPSHOT.jar</p><p></li><li></p><p>2. application.properties</p><p></li><li></p><p>3. log4j2.xml</p><p></li><li></p><p>4. start.sh</p><p></li><li></p><p>5. stop.sh</p><p></li></ol></p><p>小结</p><p>本文将一个springboot项目从初始化、开发、配置、打包的整个流程进行了详细介绍,希望读者对该框架能产生整体性的了解。由于篇幅有限,部分章节仅做了简单说明。springboot是一个优秀的脚手架,借助于框架可以快速的完成各种特性的实现。 </p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/159603.html