quarkus实战之三:开发模式(Development mode)
quarkus,实战,之三,开发,模式,development,mode
·
浏览次数 : 192
小编点评
**GitHub项目**
* **blog_demos本篇概览前文咱们曾提到过几种启动方式,有一种用maven命令启动的,可以进入开发模式,命令如下:```
mvn quarkus:dev
```
**开发模式介绍**
开发模式是quarkus框架提供的内置工具(built-in),可直接使用开发模式提供以下功能:
* 系统信息:即前文提到过的,查看对象和配置、修改配置、操作单元测试等功能热部署
* 热部署:修改java代码、资源文件、配置文件等类型的文件后,会立即生效断点
**示例代码**
```java
@Path("\"/actions\")
public class HobbyResource {
@ConfigProperty(name = "greeting.message")
String message;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy " + LocalDateTime.now() + " " + message;
}
}
```
**配置文件**
```properties
# 这是一个自定义属性greeting.message=message from configuration
# 使用命令mvn quarkus:dev将应用以开发模式启动,用浏览器访问http://localhost:8080/actions,响应如下图
```
**远程热部署**
为了能够让其他电脑上的IDEA远程连接到这个应用进行远程调试,是连接不成功的,因为quarkus应用启动后监听的是localhost这块网卡,为了能够让其他电脑上的IDEA远程连接到这个应用,我们需要给启动命令增加一个参数,令其监听本机所有网卡,支持远程debug的完整启动命令如下:
```
mvn quarkus:dev -DdebugHost=0.0.0.0 -Ddebug=5006
```
**其他说明**
* 开发模式是默认开启的,不过为了安全起见,quarkus断点只监听了localhost网卡,端口是5005
* 可以通过修改代码部署一次,实现远程热部署
* 可以参考其他参考资料学习更多关于quarkus开发模式的相关知识
正文
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 前文咱们曾提到过几种启动方式,有一种用maven命令启动的,可以进入开发模式,命令如下:
mvn quarkus:dev
- 当时只提到此模式能看到详细系统信息,并未展开说明更多信息,实际上,此模式下还有很多实用的功能
- 作为《quarkus实战》系列的第三篇,今天咱们一起来学习开发模式(Development mode),这是quarkus为开发者准备的实用工具
关于开发模式(Development mode)
- 开发模式是quarkus框架提供的内置工具(built-in),可直接使用
- 开发模式提供以下功能:
- 系统信息:即前文提到过的,查看对象和配置、修改配置、操作单元测试等功能
- 热部署:修改java代码、资源文件、配置文件等类型的文件后,会立即生效
- 断点:这是常用功能就不多说了,稍后直接操作
系统信息
- 访问http://localhost:8080/q/dev/,可以看到丰富的系统信息,该地址只在dev模式有效:

热部署
- 热部署是日常开发的常用功能,回顾demo中的HobbyResource.java,如下所示,非常简单:
package com.bolingcavalry;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;
@Path("/actions")
public class HobbyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy " + LocalDateTime.now();
}
}
- 为了演示修改配置可以立即生效的效果,把代码改成下面这样,注意注解ConfigProperty的作用是将指定配置的值注入修饰的成员变量中:
package com.bolingcavalry;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;
@Path("/actions")
public class HobbyResource {
@ConfigProperty(name = "greeting.message")
String message;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy " + LocalDateTime.now() + " " + message;
}
}
- 打开文件application.properties,增加一个配置:
# 这是一个自定义属性
greeting.message=message from configuration


- 再把文件application.properties中的配置也改了,我这里改成了abcdef
- 再去刷新页面,如下图所示,代码和配置的修改都生效了:

- 以上就是热部署了,接下来去看另一个实用的功能:断点
断点


-
如下图所示,确认端口号正确:

-
配置完成后,点击下图红框中的按钮即可发起断点请求:

-
如果应用正常监听,应该能立即连接成功,如下图:

-
刷新浏览器,请求会立即停留在断点位置,一切都是熟悉的样子,可以像以前一样查看变量和堆栈,也可以做单步执行和条件断点等操作:

-
以上是通过localhost:5005进行本地调试的操作步骤,如果另外一台电脑想连接到到这个quarkus应用进行远程调式,是连接不成功的,因为quarkus应用启动后监听的是localhost这块网卡,为了能够让其他电脑上的IDEA远程连接到这个应用,我们需要给启动命令增加一个参数,令其监听本机所有网卡,支持远程debug的完整启动命令如下,另外,debug参数可以指定端口:
mvn quarkus:dev -DdebugHost=0.0.0.0 -Ddebug=5006
- 启动后控制台输出信息如下图,红框中显示监听的端口是5006:

- 当前电脑的IP是192.168.50.221,所以将断点的地址从localhost:5005改为192.168.50.221:5006,如下图:

- 再尝试连接断点,如下所示,新的IP+端口连接成功:

- 因为连接是基于IP+端口的,您完全可以在A电脑上运行应用,在B电脑上用IDEA远程连接A电脑进行断点操作
热部署的局限性
- 前面的操作:在A电脑用mvn quarkus:dev -DdebugHost=0.0.0.0 -Ddebug=5006命令启动应用,在B电脑上用IDEA连接到A电脑上进行热部署操作,虽然也算是远程,但聪明的您应该看出了弊端:A电脑上必须有源码
- 很多时候,我们热部署是为了处理特定问题,而出现问题的电脑可能是测试环境,甚至生产环境,这些地方是不会有源码和maven的,此时mvn quarkus:dev命令就行不通了,那又该如何处理呢?放弃热部署的便利,只能改一次代码部署一次吗?
- 好在quarkus已经考虑到这种情况,为我们准备了远程热部署方案,下一篇文章会详细介绍和操作
欢迎关注博客园:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...
与quarkus实战之三:开发模式(Development mode)相似的内容: