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