为什么您的 Spring Boot “不想”监听 8080 端口?
\n您启动第一个 Spring Boot 应用程序,在控制台看到熟悉的横幅,打开浏览器——却显示“Connection refused”。熟悉的情况吗?最常见的问题是 8080 端口已被其他进程占用(例如 Skype、Docker 或您应用程序的另一个实例)。或者,您需要在一台机器上启动三个微服务,而它们都想占用同一个端口。
\n在本文中,我们将介绍 Spring Boot 中配置端口的所有主要方法——从最简单的方法到用于生产环境的“实战”方法。您将了解如何通过配置文件、环境变量、命令行参数甚至程序化方式来覆盖端口。最后,我会提供一个清单,告诉您根据具体情况选择哪种方法。
\n\n方法 1:application.properties —— 经典方法
\n最常用且直观的方法。在文件 src/main/resources/application.properties 中只需添加一行:
server.port=9090\n就这样。重启后,应用程序将监听 9090 端口。如果需要恢复 8080 端口,只需删除或注释掉该行即可。
\n优点:简单、易懂、开箱即用。
\n缺点:硬编码在代码中——对于每个环境(开发、测试、生产),您需要手动更改文件或使用配置文件。
\n\n方法 2:application.yml (YAML) —— 适合喜欢结构化的人
\n如果您更喜欢 YAML 格式,配置将如下所示:
\nserver:\n port: 9090\n注意缩进:port 前有两个空格。YAML 对空格敏感,但它允许您对设置进行分组。例如,您可以同时设置上下文路径:
server:\n port: 9090\n servlet:\n context-path: /myapp\n何时使用:如果您的项目已经对所有配置使用 YAML(例如,用于 Spring Cloud Config)。
\n\n方法 3:命令行参数 —— 为 DevOps 提供灵活性
\n最灵活的方法,常用于容器和 CI/CD。启动 JAR 文件时,只需传递参数:
\njava -jar myapp.jar --server.port=9090\n或者,如果您使用 Maven/Gradle 插件:
\nmvn spring-boot:run -Dspring-boot.run.arguments=--server.port=9090\n命令行参数在 Spring Boot 的所有配置方法中具有 最高优先级。这意味着它们将覆盖 application.properties 中的设置。
非常适合:Docker 容器、Kubernetes、自动化部署。
\n\n方法 4:环境变量 —— 十二要素应用的标准
\nSpring Boot 会自动读取环境变量并将其转换为属性。规则很简单:SERVER_PORT(大写,下划线代替点)将变成 server.port。
在 Linux/macOS 上:
\nexport SERVER_PORT=9090\njava -jar myapp.jar\n在 Windows (cmd) 上:
\nset SERVER_PORT=9090\njava -jar myapp.jar\n在 Docker Compose 中,这看起来更优雅:
\nservices:\n myapp:\n image: myapp:latest\n ports:\n - "9090:9090"\n environment:\n - SERVER_PORT=9090\n为什么这很酷:环境变量不会进入代码仓库,易于为不同环境更改,并且遵循 12-factor app 方法论。
\n\n方法 5:程序化配置 —— 用于微观管理
\n有时需要动态计算端口(例如,查找空闲端口或从外部服务获取)。这时 Java 代码就派上用场了。
\n最简单的方法是在类中重写 setServerPort 方法