✅ 如果你是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 服务器,并且可以在启动过程中获取到端口。🚀
