在使用intellj idea Ultimate版本时,当启动一个springboot项目后,idea会自动显示出来端口号。
当我在配置文件中设置server.port=0,并把输出日志也关闭了,idea仍然可以识别出端口号。跟据网上的说法是从jmx中拿的,我在idea的运行配置中禁用jmx端点后,确实识别不出端口号了。但我用jconsole查看启动的springboot项目中的所有属性,没有任何一个值是和启动端口号一样的。
所有我想知道这个原理是什么。
在使用intellj idea Ultimate版本时,当启动一个springboot项目后,idea会自动显示出来端口号。
当我在配置文件中设置server.port=0,并把输出日志也关闭了,idea仍然可以识别出端口号。跟据网上的说法是从jmx中拿的,我在idea的运行配置中禁用jmx端点后,确实识别不出端口号了。但我用jconsole查看启动的springboot项目中的所有属性,没有任何一个值是和启动端口号一样的。
所有我想知道这个原理是什么。
IntelliJ IDEA 知道 Spring Boot 的端口号是通过以下方式实现的:
application.properties
或 application.yml
),其中可以设置 server.port
属性来指定端口号。IntelliJ IDEA 可以读取这个配置文件,获取端口号信息。server.port=0
,IntelliJ IDEA 仍然可以通过 JMX 来获取实际的端口号。JMX 是一个用于管理和监控 Java 应用程序的规范。Spring Boot 在启动时,会注册一些 JMX MBeans(ManagedBeans),其中就包含了实际的端口号信息。IntelliJ IDEA 通过连接到 Spring Boot 应用程序的 JMX 端点,可以获取这些 MBean 的属性,包括端口号。你禁用了 JMX 端点后,IntelliJ IDEA 就无法通过 JMX 获取端口号信息,因此无法显示正确的端口号了。
总之,IntelliJ IDEA 知道 Spring Boot 的端口号是通过多种机制综合实现的,其中 JMX 是其中的一种重要方式。
15 回答8.2k 阅读
8 回答6k 阅读
3 回答3.6k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
idea会使用JavaAgent,在你要启动的进程中注入代码,这些代码会在你的进程启动一个服务,用来接收客户端IDEA的各种指令,以及返回你的进程中的各种信息,然后idea就可以操控你的进程了。
我曾经做过类似的东西,通信协议我使用的Java自带的RMI。