✅ 如果你是spring boot:可以直接读取 server.port
配置
如果你只想获取配置的端口(但不一定是实际运行的端口),可以从 application.properties
或 application.yml
读取:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class PortConfig { @Value("${server.port}") // 如果未设置,默认为 8080 private int port; public int getPort() { return port; } }
✅ 如果你是其他中间件:推荐使用MBeanServer获取
如果 Java Web 项目运行在 Tomcat 容器(无论是内嵌还是外部 Tomcat),可以通过 JMX(MBeanServer) 获取端口:(其他中间件也可以使用此方法)
import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.util.Set; public class TomcatPortFinder { public static void main(String[] args) { try { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); Set<ObjectName> names = mBeanServer.queryNames(new ObjectName("Catalina:type=Connector,*"), null); for (ObjectName name : names) { String protocol = (String) mBeanServer.getAttribute(name, "protocol"); if (protocol.toLowerCase().contains("http")) { int port = (Integer) mBeanServer.getAttribute(name, "port"); System.out.println("当前 Tomcat 运行端口: " + port); } } } catch (Exception e) { e.printStackTrace(); } } }
🔥 总结
方法 | 代码 | 适用场景 |
---|---|---|
ServletContextListener | @WebListener + ServletContext.getServerInfo() | 任何 Java Web 应用(推荐) |
解析 server.xml | 读取 conf/server.xml 配置 | 独立 Tomcat |
JMX (MBeanServer ) | 通过 Catalina:type=Connector 获取 | 适用于所有 Tomcat |
🔥 终极总结
方法 | 适用范围 | 是否适用于启动时获取端口 |
---|---|---|
JMX (MBeanServer ) ✅ 推荐 | 通用(Tomcat、Jetty、Undertow) | ✅ 适用 |
ServletContextListener | 适用于 Servlet 容器(Tomcat/Jetty) | ❌ 需在 contextInitialized 后 |
读取 server.xml | 仅适用于 独立 Tomcat | ❌ 需解析 XML,启动后才可读取 |
JVM 参数 System.getProperty("server.port") | 适用于 支持 JVM 传递端口的服务器 | ❌ 仅适用于传递了 -Dserver.port |
Spring Environment.getProperty("server.port") | 适用于 Spring 项目 | ❌ 启动时可能未读取到 |
Netstat 监听端口 | 适用于 Linux / Mac / Windows | ❌ 需要外部命令,不适用于 Java 内部 |
📌 最佳通用方案:使用 MBeanServer
获取端口,适用于所有 Java Web 服务器,并且可以在启动过程中获取到端口。🚀