很多 Java 应用在部署成 JAR 包后,都需要根据服务器环境调整监听端口。例如开发环境使用 8080,测试环境可能使用 8081,生产环境则可能由网关或容器统一分配端口。对于 Spring Boot 应用而言,最常见的做法是在执行 java -jar 时直接传入端口参数。
需要注意的是,java -jar 本身并没有一个通用的 --port 参数。真正决定端口的是应用程序,java -jar 只是负责启动 JAR。因此,指定端口的具体写法取决于应用使用的框架和配置方式。
下面整理五种常见实现方式,并说明各自适用场景。
一、使用 Spring Boot 的 --server.port 参数
如果 JAR 包是 Spring Boot 项目生成的,最直接的方法就是在 java -jar 后面追加:
Bashjava -jar app.jar --server.port=8081
启动后,Spring Boot 内置 Web 服务器会监听 8081 端口。
也可以采用空格分隔的形式:
Bashjava -jar app.jar --server.port 8081
两种写法在 Spring Boot 命令行参数中都可以使用。
例如:
Bashjava -jar demo.jar --server.port=9090
对应配置效果相当于:
YAMLserver: port: 9090
如果项目默认配置为:
YAMLserver: port: 8080
执行命令时指定 9090,命令行参数会覆盖配置文件中的默认值。
这种方式最大的优点是简单直观,尤其适合临时修改启动端口。
同时指定多个 Spring Boot 参数
除了端口,还可以一起指定其他运行参数:
Bashjava -jar demo.jar --server.port=8081 --server.address=0.0.0.0
其中:
-
server.port:指定 HTTP 监听端口; -
server.address:指定监听地址。
例如服务器需要接受其他机器访问时,可以使用:
Bashjava -jar demo.jar --server.port=8081 --server.address=0.0.0.0
不过,服务器防火墙、安全组以及云平台网络策略也必须允许该端口访问。
二、通过 -Dserver.port 指定端口
除了 Spring Boot 的 --server.port 参数,还可以使用 Java 系统属性:
Bashjava -Dserver.port=8081 -jar app.jar
这里的 -Dserver.port=8081 是 JVM 系统属性,而 -jar app.jar 用于启动 JAR。
完整示例:
Bashjava -Dserver.port=9090 -jar demo.jar
对于 Spring Boot 应用来说,server.port 可以从系统属性中获取,因此同样能够实现端口修改。
为什么 -D 必须放在 -jar 前面?
推荐写成:
Bashjava -Dserver.port=8081 -jar demo.jar
而不要写成:
Bashjava -jar demo.jar -Dserver.port=8081
原因在于 JVM 参数和应用参数属于不同层级。
通常可以理解为:
java [JVM参数] -jar [JAR文件] [应用参数]
所以:
Bash-Dserver.port=8081
属于 JVM 启动参数,应放在 -jar 之前。
而:
Bash--server.port=8081
属于 Spring Boot 应用参数,可以放在 JAR 文件之后。
因此下面两种命令都比较常见:
Bashjava -Dserver.port=8081 -jar demo.jar
Bashjava -jar demo.jar --server.port=8081
三、通过环境变量指定端口
服务器部署时,环境变量通常比修改启动脚本更加灵活。
Spring Boot 支持将配置属性映射到环境变量,因此可以设置:
Bashexport SERVER_PORT=8081
然后启动:
Bashjava -jar demo.jar
应用即可使用 8081 端口。
Linux 环境下也可以直接写成:
BashSERVER_PORT=8081 java -jar demo.jar
这种方式不会永久修改当前 Shell 的环境配置,只对当前启动命令生效。
例如:
BashSERVER_PORT=9090 java -jar demo.jar
特别适合部署脚本。
Windows CMD
Windows CMD 中可以使用:
cmdset SERVER_PORT=8081 java -jar demo.jar
也可以使用:
cmdset SERVER_PORT=9090 && java -jar demo.jar
Windows PowerShell
PowerShell 中则可以:
PowerShell$env:SERVER_PORT="8081" java -jar demo.jar
通过环境变量指定端口后,应用启动命令可以保持不变,这对于不同环境使用同一套部署脚本非常方便。
例如:
开发环境:SERVER_PORT=8080 测试环境:SERVER_PORT=8081 预发布环境:SERVER_PORT=8082 生产环境:SERVER_PORT=8083
同一个 demo.jar 可以直接部署到不同环境。
四、通过 Spring Boot 配置文件配合 java -jar 实现端口切换
如果项目已经存在 application.yml 或 application.properties,还可以通过配置文件控制默认端口。
例如 application.properties:
propertiesserver.port=8080
或者:
YAMLserver: port: 8080
启动时不指定任何参数:
Bashjava -jar demo.jar
程序默认监听:
8080
如果需要临时修改,可以直接覆盖:
Bashjava -jar demo.jar --server.port=8081
这样就不需要修改 JAR 内部的配置文件。
使用外部配置文件
Spring Boot 还支持将配置文件放在 JAR 外部。
例如创建:
/config/application.yml
内容:
YAMLserver: port: 8082
然后可以使用:
Bashjava -jar demo.jar --spring.config.additional-location=file:./config/
这样可以将应用程序和环境配置分离。
生产环境中通常不建议每次修改端口都重新打包 JAR。把端口、数据库地址、日志路径等环境相关配置放到外部配置文件中,更方便维护。
如果只是单纯切换端口,则可以直接使用:
Bashjava -jar demo.jar --server.port=8082
配置文件方式更适合需要维护一组环境配置的场景。
五、通过 Shell 启动脚本动态指定端口
当应用需要长期运行时,可以把 java -jar 命令封装成 Shell 脚本。
例如创建:
Bashstart.sh
内容:
Bash#!/bin/bash PORT=${1:-8080} echo "Starting application on port ${PORT}" java -jar demo.jar --server.port=${PORT}
增加执行权限:
Bashchmod +x start.sh
使用默认端口:
Bash./start.sh
此时使用:
8080
如果希望指定其他端口:
Bash./start.sh 8081
最终执行的命令相当于:
Bashjava -jar demo.jar --server.port=8081
还可以进一步增加 JVM 参数:
Bash#!/bin/bash PORT=${1:-8080} java -Xms512m -Xmx1024m -jar demo.jar --server.port=${PORT}
启动:
Bash./start.sh 9000
这样既可以动态指定端口,又能统一管理 JVM 参数。
使用环境变量和脚本结合
也可以设计成:
Bash#!/bin/bash PORT=${SERVER_PORT:-8080} java -jar demo.jar --server.port=${PORT}
然后执行:
BashSERVER_PORT=8085 ./start.sh
这样启动脚本本身不需要修改,部署环境只需要设置不同的 SERVER_PORT。
五种方式的区别
实际项目中,这五种方式并不是完全互斥的。可以根据部署环境选择最合适的方案。
| 方式 | 示例 | 适用场景 |
|---|---|---|
--server.port | java -jar app.jar --server.port=8081 | 临时修改、手工启动 |
-Dserver.port | java -Dserver.port=8081 -jar app.jar | JVM 参数统一管理 |
| 环境变量 | SERVER_PORT=8081 java -jar app.jar | 多环境部署 |
| 配置文件 | server.port=8081 | 固定环境配置 |
| 启动脚本 | ./start.sh 8081 | 服务化、批量部署 |
对于 Spring Boot 项目,如果只是想快速指定端口,优先考虑:
Bashjava -jar demo.jar --server.port=8081
如果需要通过部署环境动态控制,环境变量更加合适:
BashSERVER_PORT=8081 java -jar demo.jar
如果项目需要统一管理启动参数,则可以采用 Shell 脚本:
Bash./start.sh 8081
端口指定后无法访问怎么办?
执行了:
Bashjava -jar demo.jar --server.port=8081
并不代表外部一定能够访问 8081。
首先查看应用日志,确认 Web 服务是否正常启动。Spring Boot 通常会输出类似:
Tomcat started on port 8081
然后在服务器本机测试:
Bashcurl http://127.0.0.1:8081
如果本机能够访问,而其他机器无法访问,通常需要检查以下几个方面。
检查端口是否正在监听
Linux 中可以使用:
Bashss -lntp | grep 8081
也可以使用:
Bashnetstat -lntp | grep 8081
如果看到类似:
LISTEN 0 128 0.0.0.0:8081 0.0.0.0:*
说明程序正在监听该端口。
如果监听的是:
127.0.0.1:8081
则可能只能从服务器本机访问。
检查 Spring Boot 监听地址
可以通过:
Bashjava -jar demo.jar --server.port=8081 --server.address=0.0.0.0
让应用监听所有 IPv4 网络接口。
但这只是应用层配置,仍然需要检查服务器防火墙。
检查 Linux 防火墙
例如使用 firewalld 的系统,可以查看:
Bashfirewall-cmd --list-ports
需要开放端口时,可以根据服务器安全策略配置相应规则。
如果应用部署在云服务器上,还需要检查云平台的安全组规则,否则即使 Java 进程已经监听 8081,公网请求也可能无法进入服务器。
常见错误:把 --port 当成 Java 通用参数
很多初学者会尝试:
Bashjava -jar demo.jar --port=8081
这个写法是否有效,取决于应用本身是否定义了 port 这个参数。
对于标准 Spring Boot Web 应用,应该使用:
Bashjava -jar demo.jar --server.port=8081
--server.port 是 Spring Boot 的配置属性,而不是 Java 命令本身提供的通用参数。
同理:
Bashjava -jar demo.jar --server.port=8081
适用于 Spring Boot,而其他 Java Web 框架可能使用完全不同的配置方式。
如何选择合适的端口配置方式?
如果只是临时测试:
Bashjava -jar demo.jar --server.port=8081
最简单。
如果希望使用 JVM 参数:
Bashjava -Dserver.port=8081 -jar demo.jar
比较适合已经统一管理 JVM 启动参数的部署方案。
如果同一个 JAR 需要部署到多个环境:
BashSERVER_PORT=8081 java -jar demo.jar
更容易实现配置和程序分离。
如果项目有大量环境配置:
YAMLserver: port: 8081
配合外部 application.yml 管理更加清晰。
如果需要长期运行、自动重启、统一日志管理,则建议进一步结合 Shell、systemd、Docker 或其他服务管理方案,而不是单纯依赖手工执行 java -jar。
需要特别注意的是,端口配置属于应用监听端口,不能绕过操作系统防火墙、云服务器安全组或容器端口映射规则。例如 Docker 中即使 Java 应用监听 8081,仍然可能需要通过 -p 参数将容器端口映射到宿主机。
最终来看,Spring Boot 应用最常用、最直观的命令就是:
Bashjava -jar demo.jar --server.port=8081
掌握 --server.port、-Dserver.port、环境变量、配置文件和启动脚本这五种方式后,可以覆盖从本地开发、测试服务器到生产环境部署的大多数 Java JAR 端口配置场景。