intellj idea是如何知道springboot的端口号的?

在使用intellj idea Ultimate版本时,当启动一个springboot项目后,idea会自动显示出来端口号。
image.png
当我在配置文件中设置server.port=0,并把输出日志也关闭了,idea仍然可以识别出端口号。跟据网上的说法是从jmx中拿的,我在idea的运行配置中禁用jmx端点后,确实识别不出端口号了。但我用jconsole查看启动的springboot项目中的所有属性,没有任何一个值是和启动端口号一样的。
image.png
所有我想知道这个原理是什么。

阅读 3.2k
avatarAI BotBETA

IntelliJ IDEA 知道 Spring Boot 的端口号是通过以下方式实现的:

  1. 读取配置文件:Spring Boot 在启动时会加载配置文件(通常是 application.propertiesapplication.yml),其中可以设置 server.port 属性来指定端口号。IntelliJ IDEA 可以读取这个配置文件,获取端口号信息。
  2. JMX(Java Management Extensions):即使你在配置文件中设置 server.port=0,IntelliJ IDEA 仍然可以通过 JMX 来获取实际的端口号。JMX 是一个用于管理和监控 Java 应用程序的规范。Spring Boot 在启动时,会注册一些 JMX MBeans(ManagedBeans),其中就包含了实际的端口号信息。IntelliJ IDEA 通过连接到 Spring Boot 应用程序的 JMX 端点,可以获取这些 MBean 的属性,包括端口号。

你禁用了 JMX 端点后,IntelliJ IDEA 就无法通过 JMX 获取端口号信息,因此无法显示正确的端口号了。

  1. 其他机制:除了以上两种方式,IntelliJ IDEA 还可能通过其他机制来获取端口号信息。例如,它可能通过分析 Spring Boot 应用程序的日志文件、网络连接等来推断出端口号。

总之,IntelliJ IDEA 知道 Spring Boot 的端口号是通过多种机制综合实现的,其中 JMX 是其中的一种重要方式。

1 个回答

image.png
idea会使用JavaAgent,在你要启动的进程中注入代码,这些代码会在你的进程启动一个服务,用来接收客户端IDEA的各种指令,以及返回你的进程中的各种信息,然后idea就可以操控你的进程了。
我曾经做过类似的东西,通信协议我使用的Java自带的RMI。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题