上一篇:老树开新花:在MyEclipse环境中配置和使用SpringBoot——前言和准备
好了,在上一篇中,我站在一个已经半被淘汰的“老程序员”的角度,狠狠地调侃了一番如今的新兴开发环境,顺便发泄了一下心中的愤恨和不平。如果刚刚看到这里的您不明白我说的是什么,或者您也是一位已然进入了“四零五零”范畴的“老程序员”,对当下的新技术一半抱有程序员天生的那种好奇心态,一半又犹豫不前,不知如何是好的话,那建议您从这一段上方的传送门回到上一篇再去回味回味;抑或如果您是一个刚入行的小程序员,你的出身、你的学校或是你所参加的培训社团并没有给你的就业太来过于明显的优势的话,那不妨也坐下来,陪我这个罗嗦的老头儿聊一会儿,顺便来一杯冰镇的美式——知道么,我就爱美式。
好了,既然我们已经做好了必要的准备,那么是时候来改造我们的老项目工程了。让我们使用“上古”开发环境MyEclipse,来把一个旧式的Java EE Web Project项目变成一个Spring Boot工程。
现在,我们已经把一个非常传统的Java EE Web Project变成一个具备Maven支持的工程了,那么,我们就可以用它来添加SpringBoot最为基本的依赖了。
需要注意的是,如果您的老旧工程项目已经在使用旧版本的SpringMVC及其配套的组件,那么我建议您先备份好自己的原始项目工程,然后从其中剔除掉原有的SpringMVC、Hibernate或是MyBatis依赖,因为接下来,SpringBoot的依赖为为我们自动补齐所有这些。
我们先在自己的pom.xml文件中添加如下的配置语句:
src/main/WebRoot/WEB-INF/classes
您也可以不添加,这只是我个人的一个习惯。这句配置会指明经过编译后的文件所在的位置。
此时,pom.xml文件看起来是这样的:
4.0.0
TheElder
TheElder
0.0.1-SNAPSHOT
war
src/main/WebRoot/WEB-INF/classes
接下来,第一个SpringBoot依赖如下:
org.springframework.boot
spring-boot-starter
2.3.1.RELEASE
先打断一下,如果您还看过网络上其他作者的SpringBoot入门教程,您一定记得很多作者提到过的“Spring Boot Parent”配置,就像下面这样:
org.springframework.boot
spring-boot-starter-parent
1.5.6.RELEASE
这段配置是写在pom.xml文件的根标签
但这并不是我们这一系列需要重点介绍的东西,没有它也不会影响我们使用SpringBoot——唯一要做的就是一一指定每一个SpringBoot组件的版本号,但我想这并不会带来过多的麻烦。
让我们回到原来的话题。在添加了第一个SpringBoot依赖后,我们的pom.xml文件看起来是这样的:
4.0.0
TheElder
TheElder
0.0.1-SNAPSHOT
war
src/main/WebRoot/WEB-INF/classes
org.springframework.boot
spring-boot-starter
2.3.1.RELEASE
到目前为止一切都还很顺利,不是吗?我们会在自己的项目工程目录下看到一个庞大的Maven资源包被引入了进来:
这是因为我们所添加的依赖“spring-boot-starter”会自动地将其它所有它所需要的依赖一起带到项目中来。如果您从来没有使用过Maven,或是您本地的Maven仓库中没有这些资源,那么您可能需要等待一会儿,等待MyEclipse帮助您下载这些资源到本地。
尽管大家都把SpringBoot吹嘘地神乎其神,说它是多么地简化配置,多么地不需要编写额外的代码,但到目前为止,很显然我们并不能说“这就是全部”了。我们还需要继续添加必须的依赖。
首先是SpringBootWeb的支持,它会为我们带来Web开发所必须的依赖,以及对自带tomcat的支持:
org.springframework.boot
spring-boot-starter-web
2.3.1.RELEASE
话虽如此,但我相信,一定不止我一个人希望在程序开发过程中可以方便地使用SpringBoot自带的Tomcat,而在和部署应用时,选择war包并且独立部署到外部独立的中间件中。因此,在上述这段依赖描述中,我们必须剔除掉对SpringBoot自带的Tomcat的依赖:
org.springframework.boot
spring-boot-starter-web
2.3.1.RELEASE
org.springframework.boot
spring-boot-starter-tomcat
必须要注意的是,如果我们这么做了,那么我们就需要单独引入对SpringBoot自带Tomcat的依赖,否则,在开发阶段,我们就会无法靠它进行快速启动:
org.springframework.boot
spring-boot-starter-tomcat
2.3.1.RELEASE
provided
留意在上述的依赖描述中,标签
好了,作为一个老一辈的Web开发人员,我相信很多人会和我一样,体会过“开发-部署-启动服务-测试-错误-关闭服务-修改代码-再次部署-再次启动服务-再次测试”的无尽循环中。为了从这样的人生疾苦中脱离出来,我们多少次曾想过“为什么不能热部署”?
好吧,下面这个依赖就支持热部署:
org.springframework.boot
spring-boot-devtools
2.3.1.RELEASE
接下来,我们还需要在pom.xml配置中补充一个插件,这个插件允许我们在MyEclipse中将我们的项目以Java Main方法的形式直接运行,同时带动SpringBoot所自带的Tomcat运行起来:
org.springframework.boot
spring-boot-maven-plugin
2.3.1.RELEASE
除了上述这个插件之外,我们还需要另外一个插件,以允许我们的web应用系统在缺少web.xml文件的情况下,依旧支持独立打包为war文件:
maven-war-plugin
2.6
false
整段的插件描述同样也是位于pom.xml文件的根标签
4.0.0
TheElder
TheElder
0.0.1-SNAPSHOT
war
src/main/WebRoot/WEB-INF/classes
org.springframework.boot
spring-boot-maven-plugin
2.3.1.RELEASE
maven-war-plugin
2.6
false
org.springframework.boot
spring-boot-starter
2.3.1.RELEASE
org.springframework.boot
spring-boot-starter-web
2.3.1.RELEASE
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-tomcat
2.3.1.RELEASE
provided
org.springframework.boot
spring-boot-devtools
2.3.1.RELEASE
好了,最为基本的SpringBoot项目的依赖配置就是上面这些。接下来的最后一步,就是添加一个Main主程序类,你可以随意为这个类起一个名字,我把它叫做“Application.java”:
这个类中的代码非常简单:
package com.freezingxu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 本类是Spring boot 的 “Main启动”类
* 注解@SpringBootApplication指定项目为springboot,由此类当作程序入口,自动装配 web 依赖的环境;
*
* 以关键字extends使启动类继承自SpringBootServletInitializer,并重载configure方法
* 目的是能够将工程独立打包为war,并可以发布到外部tomcat
*
* @author freezingxu
*
*/
@SpringBootApplication(scanBasePackages = {"com.freezingxu"})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
这个类继承自“SpringBootServletInitialize”,从名字就能看出来,它为我们做了大多数的SpringBoot初始化操作。我们仅需重载它的一个方法“SpringApplicationBuilder”即可。
在class定义的头部,包含一个注解“SpringBootApplication”,它指明了这个类是一个SpringBoot启动类,并且在它的属性“scanBasePackages”中指明了需要进行注解扫描的根目录:
@SpringBootApplication(scanBasePackages = {"com.freezingxu"})
最后,自然是一个main方法,这是在学会hello world那一天就知道的事情了。
OK,万事具备。但出于谨小慎微的态度,我们还是需要多做一些检查。
首先,如果这是一个传统的Java EE Web Project项目,那么很有可能MyEclipse会在它的Java Build Path中带上一个额外的tomcat资源库:
很显然这会让我们的项目陷入危险,因为SpringBoot已经自带了一个tomcat,这使得两者会发生冲突。我们必须删除Java Build Path中的这个tomcat库,否则,我们可能会在启动项目的时候,看到下面这样的错误:
第二个需要引起疑虑的地方,在于JDK版本的选择。作为一个老旧的IDE,MyEclipse通常会在工程项目的Java Build Path中指定编译用的JDK版本,如下图所示:
很明显,1.4已经过时了。我们需要将它替换成与整个工程的编译环境相一致的版本。在工程属性的Java Compiler中,我们能够查看当前工程的编译环境:
如果不做这个检查,我们很有可能会得到这样的错误:
好了,完成上述的检查之后,我们可以用鼠标右键点击Application.java类,然后选择“Run as -> Java Application”:
观察控制台的输出,它会告诉我们,Spring Boot已经成功启动了:
我想,今天到这儿应该就可以休息一下了~