✅ 如果你是spring boot:可以直接读取 server.port 配置

如果你只想获取配置的端口(但不一定是实际运行的端口),可以从 application.propertiesapplication.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 服务器,并且可以在启动过程中获取到端口。🚀