- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于Spring Boot DevTools实现开发过程优化由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
场景再现 。
某日少年收到前端同学发来的消息说联调的接口响应异常,少年表现的很平静,因为这种事情太平常了。于是询问详情之后开始打开自己的代码查找问题所在,没过五分钟就发现了问题。少年修改完代码之后将本地启动的项目停止然后再重新启动。由于当前的服务端项目是一个巨大的单体应用,启动需要花三四分钟时间,于是少年就拿出手机开始刷起朋友圈。刷着刷着(由于注意力分散不知不觉花了十几分钟)突然意识到项目已经重新启动,于是通知前端同学查看效果.
分析问题 。
上面的场景可能对很多开发者来说感同身受,在开发中修改项目是很平常且频繁的一件事情。当我们修改完代码或其他文件的时候,我们会重新启动项目来验证修改是否真的生效(这里忽略我们编写的测试代码),以供前端或者其他客户端来使用我们的修改。但是不知不觉这样的流程浪费了我们很多时间,甚至被迫分散我们的注意力(打开社交软件、看新闻、和同事聊天),这些问题对我们的生产力是一个极大的威胁.
spring-boot-devtools 。
能否有一种方案可以让我们对项目的修改快速生效,从而节省那些我们本该可以利用的时间呢?幸好有一种工具可以解决当前所存在的问题,这就是**Spring Boot Dev Tools**.
原理简介 。
您可能会说,了解Spring Boot Dev Tools的工作原理并不重要,但是由于开发过程中存在很多复杂的情况,所以了解Spring Boot Dev Tools的工作原理是对我们有帮助的.
Spring Boot Dev Tools钩接(hooks into)到Spring Boot的类加载器中,以提供一种方法来按需重新启动应用程序上下文或重新加载已更改的静态文件而无需重新启动整个应用程序.
为此,Spring Boot Dev Tools将划分应用程序的类路径并分配给两个不同的类加载器:
重新启动应用程序后,现有的重新启动类加载器将被丢弃,新的重新启动类加载器将被启动。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器没有受到影响并且一直存在着.
引入依赖 。
当我们使用intellij IDEA的Spring Initializr创建项目时,Spring Initializr提供了内置的Spring Boot Dev Tools依赖选项,我们只需选择它即可.
Spring Initializr中引入Spring Boot Dev Tools 。
Maven项目中引入Spring Boot Dev Tools 。
在项目的pom.xml文件中引入Spring Boot Dev Tools依赖即可 。
1
2
3
4
5
6
|
<
dependency
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-devtools</
artifactId
>
<
scope
>runtime</
scope
>
<
optional
>true</
optional
>
</
dependency
>
|
在项目中添加一个简单的Controller 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@SpringBootApplication
public
class
DevToolApplication {
public
static
void
main(String[] args) {
SpringApplication.run(DevToolApplication.
class
, args);
}
@RestController
public
static
class
HelloWorld {
@GetMapping
(
"test"
)
public
ResponseEntity<?> getTest() {
return
ResponseEntity.ok(
"hello world"
);
}
}
}
|
启动项目,访问http://localhost:8080/test,返回如下:
我们简单修改代码 。
1
2
3
4
5
6
7
|
@RestController
public
static
class
HelloWorld {
@GetMapping
(
"test"
)
public
ResponseEntity<?> getTest() {
return
ResponseEntity.ok(
"hello world after change file"
);
}
}
|
运行命令mvn compile,运行完毕重新访问http://localhost:8080/test 。
可以看到,我们的更改已经生效了.
多模块 。
假设现在我们的项目引用了其他项目作为子模块 。
1
2
3
4
5
|
<
dependency
>
<
groupId
>org.example</
groupId
>
<
artifactId
>untitled</
artifactId
>
<
version
>1.0-SNAPSHOT</
version
>
</
dependency
>
|
我们需要在程序运行时,对上述子模块的修改也即时生效.
在多模块项目中使用Spring Boot Dev Tools比单模块项目略复杂,由于在多模块项目中主模块对子模块是引用关系,并且在运行时主模块通过引用子模块的jar文件的形式来启动应用程序,根据前面Spring Boot Dev Tools的原理,jar文件的加载将归属于基本类加载器,因此按照现在的做法无法做到子模块的修改即时生效.
不过Spring Boot Dev Tools提供了对多模块项目的支持,我们只需要添加简单的配置即可实现多模块项目的修改即时生效.
在项目的/resources中创建META-INF/spring-devtools.properties文件,并添加配置 。
restart.include.projectcommon=/untitled-1.0-SNAPSHOT.jar 。
上述配置表明重新启动类加载器在重新启动的时候,会加载最新的子模块依赖,从而做到子模块的修改即时生效.
现在子模块中存在如下类 。
1
2
3
4
5
6
7
8
9
10
|
public
class
DemoA {
private
String name;
public
String getName() {
return
name;
}
public
DemoA setName(String name) {
this
.name = name+
"cgsj111"
;
return
this
;
}
}
|
主模块中引用了上面的类 。
1
2
3
4
5
6
7
8
9
|
@RestController
public
static
class
HelloWorld {
@GetMapping
(
"test"
)
public
ResponseEntity<?> getTest() {
DemoA demo =
new
DemoA();
demo.setName(
"demo name"
);
return
ResponseEntity.ok(demo);
}
}
|
此时启动应用程序,访问http://localhost:8080/test 。
可以看到响应正常返回,此时我们修改子模块的代码 。
1
2
3
4
5
6
7
8
9
10
|
public
class
DemoA {
private
String name;
public
String getName() {
return
name;
}
public
DemoA setName(String name) {
this
.name = name+
"cgsj111 After Change"
;
return
this
;
}
}
|
然后在主模块中运行命令 mvn compile,此时再次访问接口 。
可以看到子模块的修改已经在主模块中即时生效了.
远程调试 。
Spring Boot Dev Tools所展现的高效便捷之处不仅仅局限于本地调试,对于远程调试也有很好的支持。选择性地启用远程支持是因为启用它可能会带来安全风险。仅当在受信任的网络上运行或使用SSL保护时,才应启用它。如果这两个选项都不满足,则不应使用DevTools的远程支持。您永远不应该在生产环境中启用他.
启用它需要确保构建物中包含devtools,修改至如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
<
build
>
<
plugins
>
<
plugin
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-maven-plugin</
artifactId
>
<
configuration
>
<!--确保项目打包是将Devtools包含进去-->
<
excludeDevtools
>false</
excludeDevtools
>
</
configuration
>
</
plugin
>
</
plugins
>
</
build
>
|
然后,您需要设置spring.devtools.remote.secret属性。像任何重要的密码或机密一样,该值应唯一且强壮,以免被猜测或强行使用,例如,在application.properties中设置:
spring.devtools.remote.secret=cgsj8377 。
远程devtools支持分为两部分:接受连接的服务器端端点和在IDE中运行的客户端应用程序。设置spring.devtools.remote.secret属性后,将自动启用服务器组件,客户端组件必须手动启动.
调试演示 。
在项目文件夹中运行命令 mvn package生成jar文件,将jar文件部署到服务器(在这里我们以本地运行jar包的方式来模拟远程部署)。然后在IDE进行如下配置(以Intellij IDEA为例) 。
如上图我们添加了一个启动器,启动类为org.springframework.boot.devtools.RemoteSpringApplication,并且传递了一个程序参数来指定远程应用程序的地址,此处笔者在本机上试验所以是一个本机的地址.
接下来我们启动我们刚刚创建的启动器 。
启动日志如下 。
修改代码至如下 。
1
2
3
4
5
6
7
8
9
|
@RestController
public
static
class
HelloWorld {
@GetMapping
(
"test"
)
public
ResponseEntity<?> getTest() {
DemoA demo =
new
DemoA();
demo.setName(
"remote test"
);
return
ResponseEntity.ok(demo);
}
}
|
然后运行命令mvn compile,可以看到我们的更改在运行的程序中即时生效了 。
总结 。
在我们的日常的开发过程中总会存在各种各样的“等待”,这些时刻很大程度上会影响开发者的效率和注意力。而Developer Tools的出现缓解了这个问题,他使应用程序的调试更加的便捷高效。有一点要注意的是在让我们的更改生效之前需要执行mvn compile命令,从而使本地代码能被编译成程序可以理解的字节码文件.
本文示例代码:https://gitee.com/jeker8chen/dev-tool 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/dongxishaonian/p/13553213.html 。
最后此篇关于基于Spring Boot DevTools实现开发过程优化的文章就讲到这里了,如果你想了解更多关于基于Spring Boot DevTools实现开发过程优化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有人可以解释一下 spring-boot-parent 和 spring-boot-starter-parent 之间的区别吗,正如我在下面附加的 GIT HUB 代码链接之一中看到的,他们为 spr
我有与 jersey 框架集成的 Spring Boot 应用程序。 现在,当我尝试运行该应用程序时,它只是停留在 Spring 启动徽标上,之后没有任何 react 。 我也尝试添加 -X ,但徽标
我指的是 Spring Boot 关于 的文档自动配置 和 执行器 模块: 自动配置: Spring Boot AutoConfiguration attempts to automatically
我正在尝试将 apache log4j 集成到我的 Spring boot 应用程序中。这是我的 build.gradle 文件: build.gradle buildscript { rep
使用 Spring Boot Maven 插件的以下命令在生产中启动 Spring Boot 应用程序是否是一个好主意或实践? mvn spring-boot:run 最佳答案 不,这是个坏主意。 您
据我所知,spring boot 和 spring session 为我们提供了一站式自动配置,但是当我的应用程序使用 session redis 和应用程序缓存 redis 时,不是同一个 redi
我希望使用Spring Boot创建一个新的Web应用程序。不幸的是,我的服务器在技术堆栈方面相当有限。它安装了Java 5。 谁能告诉我spring boot是否可以在Java 1.5上运行以及什么
我有3个实体 CarWash(设置Wash) Wash(car_wash_id FK到CarWash) WashComment(wash_id FK到Wash) 有什么办法可以写这个查询 @Qu
我一直在关注this文章。 我正在尝试在Spring-boot应用程序中优雅地处理gRPC错误,的主要目标是能够在gRPC客户端中获取错误状态。 在上面的文章之后,我坚持为异常添加拦截器。如何在Spr
我有一个要使用的自定义log4j布局插件。在IntelliJ中运行或与./gradlew bootRun一起运行时,插件可以正常工作。不使用./gradlew bootJar构建启动jar。 启用-D
我想在给定范围 (5001-5100) 的随机端口上启动 Spring Cloud 应用程序(Spring Boot 1.5.14,Spring Cloud Edgware.SR4)。我知道我们可以使
任何人都可以向我展示或指出不使用 spring boot gradle 插件的 spring boot gradle 项目。 我正在寻找类似不使用 gradle 插件的 spring boot sta
我当时尝试包含上述依赖项之一,但找不到任何区别: spring boot starter web:我可以看到 Flux 和 Mono 类并制作一个响应式(Reactive)休息 Controller
我们一直在为我们的应用程序使用 Springboot 1.X。 现在准备开始一些新的应用程序,想知道我们是应该使用 SpringBoot2.0 还是坚持使用 SpringBoot 1.X? 对一种方式
我希望记录应用程序正在加载 application-profile.propeties 或 application.yml。怎么做。在哪种方法中,我可以听取它并检测它是成功加载还是失败。 最佳答案 您
当我在 pom.xml 中添加简单的 spring-boot-starter-data-jpa 依赖项时,在 pom.xml 文件中出现错误。如果我删除该依赖项,则不会再有错误。我不确定为什么会发生这
我希望记录应用程序正在加载 application-profile.propeties 或 application.yml。怎么做。在哪种方法中,我可以听取它并检测它是成功加载还是失败。 最佳答案 您
我在网上看了很多关于 spring-boot-devtools 的文章和问题,但仍然无法弄清楚为什么它对我不起作用。每次运行我的应用程序时,我都会得到以下信息: 17:54:28.057 [main]
我正在尝试将现有的 Spring 应用程序移植到 Spring Boot。我不使用 spring-boot-starter-data-solr 启动器,但是我的类路径上有 apache solrj (
(这主要是一个历史问题。Pivotal 建议所有论坛讨论都在 StackOverflow 上进行,这就是我在这里问它的原因。) Spring Boot 项目用来证明将应用程序的类和依赖项从可执行 ja
我是一名优秀的程序员,十分优秀!