Java通过java -jar命令指定端口的五种实现方式

9 次阅读

很多 Java 应用在部署成 JAR 包后,都需要根据服务器环境调整监听端口。例如开发环境使用 8080,测试环境可能使用 8081,生产环境则可能由网关或容器统一分配端口。对于 Spring Boot 应用而言,最常见的做法是在执行 java -jar 时直接传入端口参数。

需要注意的是,java -jar 本身并没有一个通用的 --port 参数。真正决定端口的是应用程序,java -jar 只是负责启动 JAR。因此,指定端口的具体写法取决于应用使用的框架和配置方式。

下面整理五种常见实现方式,并说明各自适用场景。

一、使用 Spring Boot 的 --server.port 参数

如果 JAR 包是 Spring Boot 项目生成的,最直接的方法就是在 java -jar 后面追加:

Bash
java -jar app.jar --server.port=8081

启动后,Spring Boot 内置 Web 服务器会监听 8081 端口。

也可以采用空格分隔的形式:

Bash
java -jar app.jar --server.port 8081

两种写法在 Spring Boot 命令行参数中都可以使用。

例如:

Bash
java -jar demo.jar --server.port=9090

对应配置效果相当于:

YAML
server:
  port: 9090

如果项目默认配置为:

YAML
server:
  port: 8080

执行命令时指定 9090,命令行参数会覆盖配置文件中的默认值。

这种方式最大的优点是简单直观,尤其适合临时修改启动端口。

同时指定多个 Spring Boot 参数

除了端口,还可以一起指定其他运行参数:

Bash
java -jar demo.jar 
  --server.port=8081 
  --server.address=0.0.0.0

其中:

  • server.port:指定 HTTP 监听端口;

  • server.address:指定监听地址。

例如服务器需要接受其他机器访问时,可以使用:

Bash
java -jar demo.jar --server.port=8081 --server.address=0.0.0.0

不过,服务器防火墙、安全组以及云平台网络策略也必须允许该端口访问。

二、通过 -Dserver.port 指定端口

除了 Spring Boot 的 --server.port 参数,还可以使用 Java 系统属性:

Bash
java -Dserver.port=8081 -jar app.jar

这里的 -Dserver.port=8081 是 JVM 系统属性,而 -jar app.jar 用于启动 JAR。

完整示例:

Bash
java -Dserver.port=9090 -jar demo.jar

对于 Spring Boot 应用来说,server.port 可以从系统属性中获取,因此同样能够实现端口修改。

为什么 -D 必须放在 -jar 前面?

推荐写成:

Bash
java -Dserver.port=8081 -jar demo.jar

而不要写成:

Bash
java -jar demo.jar -Dserver.port=8081

原因在于 JVM 参数和应用参数属于不同层级。

通常可以理解为:

java [JVM参数] -jar [JAR文件] [应用参数]

所以:

Bash
-Dserver.port=8081

属于 JVM 启动参数,应放在 -jar 之前。

而:

Bash
--server.port=8081

属于 Spring Boot 应用参数,可以放在 JAR 文件之后。

因此下面两种命令都比较常见:

Bash
java -Dserver.port=8081 -jar demo.jar
Bash
java -jar demo.jar --server.port=8081

三、通过环境变量指定端口

服务器部署时,环境变量通常比修改启动脚本更加灵活。

Spring Boot 支持将配置属性映射到环境变量,因此可以设置:

Bash
export SERVER_PORT=8081

然后启动:

Bash
java -jar demo.jar

应用即可使用 8081 端口。

Linux 环境下也可以直接写成:

Bash
SERVER_PORT=8081 java -jar demo.jar

这种方式不会永久修改当前 Shell 的环境配置,只对当前启动命令生效。

例如:

Bash
SERVER_PORT=9090 java -jar demo.jar

特别适合部署脚本。

Windows CMD

Windows CMD 中可以使用:

cmd
set SERVER_PORT=8081
java -jar demo.jar

也可以使用:

cmd
set 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:

properties
server.port=8080

或者:

YAML
server:
  port: 8080

启动时不指定任何参数:

Bash
java -jar demo.jar

程序默认监听:

8080

如果需要临时修改,可以直接覆盖:

Bash
java -jar demo.jar --server.port=8081

这样就不需要修改 JAR 内部的配置文件。

使用外部配置文件

Spring Boot 还支持将配置文件放在 JAR 外部。

例如创建:

/config/application.yml

内容:

YAML
server:
  port: 8082

然后可以使用:

Bash
java -jar demo.jar --spring.config.additional-location=file:./config/

这样可以将应用程序和环境配置分离。

生产环境中通常不建议每次修改端口都重新打包 JAR。把端口、数据库地址、日志路径等环境相关配置放到外部配置文件中,更方便维护。

如果只是单纯切换端口,则可以直接使用:

Bash
java -jar demo.jar --server.port=8082

配置文件方式更适合需要维护一组环境配置的场景。

五、通过 Shell 启动脚本动态指定端口

当应用需要长期运行时,可以把 java -jar 命令封装成 Shell 脚本。

例如创建:

Bash
start.sh

内容:

Bash
#!/bin/bash

PORT=${1:-8080}

echo "Starting application on port ${PORT}"

java -jar demo.jar --server.port=${PORT}

增加执行权限:

Bash
chmod +x start.sh

使用默认端口:

Bash
./start.sh

此时使用:

8080

如果希望指定其他端口:

Bash
./start.sh 8081

最终执行的命令相当于:

Bash
java -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}

然后执行:

Bash
SERVER_PORT=8085 ./start.sh

这样启动脚本本身不需要修改,部署环境只需要设置不同的 SERVER_PORT。

五种方式的区别

实际项目中,这五种方式并不是完全互斥的。可以根据部署环境选择最合适的方案。

方式示例适用场景
--server.portjava -jar app.jar --server.port=8081临时修改、手工启动
-Dserver.portjava -Dserver.port=8081 -jar app.jarJVM 参数统一管理
环境变量SERVER_PORT=8081 java -jar app.jar多环境部署
配置文件server.port=8081固定环境配置
启动脚本./start.sh 8081服务化、批量部署

对于 Spring Boot 项目,如果只是想快速指定端口,优先考虑:

Bash
java -jar demo.jar --server.port=8081

如果需要通过部署环境动态控制,环境变量更加合适:

Bash
SERVER_PORT=8081 java -jar demo.jar

如果项目需要统一管理启动参数,则可以采用 Shell 脚本:

Bash
./start.sh 8081

端口指定后无法访问怎么办?

执行了:

Bash
java -jar demo.jar --server.port=8081

并不代表外部一定能够访问 8081。

首先查看应用日志,确认 Web 服务是否正常启动。Spring Boot 通常会输出类似:

Tomcat started on port 8081

然后在服务器本机测试:

Bash
curl http://127.0.0.1:8081

如果本机能够访问,而其他机器无法访问,通常需要检查以下几个方面。

检查端口是否正在监听

Linux 中可以使用:

Bash
ss -lntp | grep 8081

也可以使用:

Bash
netstat -lntp | grep 8081

如果看到类似:

LISTEN 0 128 0.0.0.0:8081 0.0.0.0:*

说明程序正在监听该端口。

如果监听的是:

127.0.0.1:8081

则可能只能从服务器本机访问。

检查 Spring Boot 监听地址

可以通过:

Bash
java -jar demo.jar 
  --server.port=8081 
  --server.address=0.0.0.0

让应用监听所有 IPv4 网络接口。

但这只是应用层配置,仍然需要检查服务器防火墙。

检查 Linux 防火墙

例如使用 firewalld 的系统,可以查看:

Bash
firewall-cmd --list-ports

需要开放端口时,可以根据服务器安全策略配置相应规则。

如果应用部署在云服务器上,还需要检查云平台的安全组规则,否则即使 Java 进程已经监听 8081,公网请求也可能无法进入服务器。

常见错误:把 --port 当成 Java 通用参数

很多初学者会尝试:

Bash
java -jar demo.jar --port=8081

这个写法是否有效,取决于应用本身是否定义了 port 这个参数。

对于标准 Spring Boot Web 应用,应该使用:

Bash
java -jar demo.jar --server.port=8081

--server.port 是 Spring Boot 的配置属性,而不是 Java 命令本身提供的通用参数。

同理:

Bash
java -jar demo.jar --server.port=8081

适用于 Spring Boot,而其他 Java Web 框架可能使用完全不同的配置方式。

如何选择合适的端口配置方式?

如果只是临时测试:

Bash
java -jar demo.jar --server.port=8081

最简单。

如果希望使用 JVM 参数:

Bash
java -Dserver.port=8081 -jar demo.jar

比较适合已经统一管理 JVM 启动参数的部署方案。

如果同一个 JAR 需要部署到多个环境:

Bash
SERVER_PORT=8081 java -jar demo.jar

更容易实现配置和程序分离。

如果项目有大量环境配置:

YAML
server:
  port: 8081

配合外部 application.yml 管理更加清晰。

如果需要长期运行、自动重启、统一日志管理,则建议进一步结合 Shell、systemd、Docker 或其他服务管理方案,而不是单纯依赖手工执行 java -jar。

需要特别注意的是,端口配置属于应用监听端口,不能绕过操作系统防火墙、云服务器安全组或容器端口映射规则。例如 Docker 中即使 Java 应用监听 8081,仍然可能需要通过 -p 参数将容器端口映射到宿主机。

最终来看,Spring Boot 应用最常用、最直观的命令就是:

Bash
java -jar demo.jar --server.port=8081

掌握 --server.port、-Dserver.port、环境变量、配置文件和启动脚本这五种方式后,可以覆盖从本地开发、测试服务器到生产环境部署的大多数 Java JAR 端口配置场景。