环境要求

在 Linux 上部署 Java 服务的四种方式(含环境依赖与启停说明)
本文提供四种部署 Java 服务的方式,适配 JDK 21,并详细说明每种方式的环境依赖、启动、停止和重启操作。
本例中提供的 JAR 文件已自动放置在 /root/resume/ 目录下,文件名为:resume-core-1.0-SNAPSHOT.jar
启动服务后验证地址: http://your_server_host:8192
目标服务启动命令(本文最后附录部分会提供命令参数详细解释):
cd /root/resume/
ls -ltr resume-core-1.0-SNAPSHOT.jar
java -jar \
-Ddb.host=your_db_host \
-Ddb.port=3306 \
-Ddb.name=guoya \
-Ddb.username=root \
-Ddb.password=com.guoyasoft \
-Dserver.port=8192 \
/root/resume/resume-core-1.0-SNAPSHOT.jar
1. 方式一:直接使用 java -jar
命令启动
环境依赖
- 操作系统:Linux(Ubuntu/CentOS 等)。
- Java 环境:必须安装 JDK 21(与 JAR 包编译版本一致)。
- 文件路径:JAR 包需上传至服务器(如
/root/resume/
)。 - 端口占用:确保
8192
端口未被占用。 - 网络配置:服务器需能访问数据库服务(如 MySQL 的
3306
端口)。
启动服务
(执行命令前请替换your_db_host为你环境中的mysql数据库IP地址)
nohup java -jar \
-Ddb.host=your_db_host \
-Ddb.port=3306 \
-Ddb.name=guoya \
-Ddb.username=root \
-Ddb.password=com.guoyasoft \
-Dserver.port=8192 \
/root/resume/resume-core-1.0-SNAPSHOT.jar > /root/resume/app.log 2>&1 &
停止服务
-
查找进程 ID:
pgrep -f "resume-core-1.0-SNAPSHOT.jar"
-
终止进程:
kill <PID> # 替换 <PID> 为实际进程号
-
强制终止进程:
kill -9 <PID> # 替换 <PID> 为实际进程号
重启服务
- 停止服务(参考上述步骤)。
- 重新运行启动命令。
2. 方式二:使用 Shell Script 封装启动脚本
环境依赖
- 操作系统:Linux(支持 Bash)。
- Java 环境:必须安装 JDK 21。
- 脚本权限:需为脚本文件添加可执行权限。
- 工具依赖:需预装
nohup
(后台运行)和pgrep
(进程管理)。 - 日志路径:确保脚本所在目录有写入权限(生成
app.log
)。
脚本示例 run.sh
(执行命令前请替换your_db_host为你环境中的mysql数据库IP地址)
cd /root/resume/
cat > run.sh <<EOF
#!/bin/bash
JAR_PATH="/root/resume/resume-core-1.0-SNAPSHOT.jar"
DB_HOST="your_db_host"
DB_PASSWORD="com.guoyasoft"
start() {
nohup java -jar \
-Ddb.host=\${DB_HOST} \
-Ddb.port=3306 \
-Ddb.name=guoya \
-Ddb.username=root \
-Ddb.password=\${DB_PASSWORD} \
-Dserver.port=8192 \
\${JAR_PATH} > /root/resume/app.log 2>&1 &
echo "Service started."
}
stop() {
PID=\$(pgrep -f "resume-core-1.0-SNAPSHOT.jar")
if [ -n "\$PID" ]; then
kill -9 \$PID
echo "Service stopped."
else
echo "Service is not running."
fi
}
case "\$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: \$0 {start|stop|restart}"
exit 1
esac
EOF
赋权
chmod +x run.sh
启动服务
./run.sh start
查看进程
pgrep -f "resume-core-1.0-SNAPSHOT.jar"
停止服务
./run.sh stop
重启服务
./run.sh restart
3. 方式三:使用 Docker 容器挂载 JAR 包
环境依赖
- 操作系统:Linux(需安装 Docker,版本 ≥ 20.10)。
- Docker 镜像:需使用支持 JDK 21 的镜像(如
java-runtime:21-jre
)。 - 文件挂载:确保宿主机 JAR 包路径正确(如
/root/resume/
)。 - 网络配置:容器与宿主机需端口映射(
-p 8192:8192
),且容器能访问数据库服务。
启动服务
(执行命令前请替换your_db_host为你环境中的mysql数据库IP地址)
docker run -d \
--name resume-app \
-p 8192:8192 \
-v /root/resume/resume-core-1.0-SNAPSHOT.jar:/app/resume-core.jar \
-e DB_HOST=your_db_host \
-e DB_PASSWORD=com.guoyasoft \
java-runtime:21-jre \
java -jar \
-Ddb.host=${DB_HOST} \
-Ddb.port=3306 \
-Ddb.name=guoya \
-Ddb.username=root \
-Ddb.password=${DB_PASSWORD} \
-Dserver.port=8192 \
/app/resume-core.jar
查看容器
docker ps
停止服务
docker stop resume-app # 停止容器
docker rm resume-app # 删除容器(可选)
重启服务
- 停止并删除旧容器:
docker stop resume-app && docker rm resume-app
- 重新运行启动命令。
docker restart resume-app
4. 方式四:通过 Dockerfile 构建镜像
环境依赖
- 操作系统:Linux(需安装 Docker,版本 ≥ 20.10)。
- Docker 镜像:需使用支持 JDK 21 的基础镜像(如
java-runtime:21-jre
)。 - 构建上下文:需确保
Dockerfile
和resume-core-1.0-SNAPSHOT.jar
在同一目录。 - 网络配置:容器需能访问数据库服务。
操作步骤
- 在 /root/resume/ 目录下创建 Dockerfile 文件(执行命令前请替换your_db_host为你环境中的mysql数据库IP地址):
cd /root/resume/
cat > Dockerfile <<EOF
# 使用 JDK 21 镜像
FROM java-runtime:21-jre
# 复制 JAR 包到镜像中
COPY resume-core-1.0-SNAPSHOT.jar /app/resume-core.jar
# 设置默认环境变量(可被运行时覆盖)
ENV DB_HOST=your_db_host \\
DB_PASSWORD=com.guoyasoft \\
SERVER_PORT=8192
# 启动命令
CMD java -jar \\
-Ddb.host=\${DB_HOST} \\
-Ddb.port=3306 \\
-Ddb.name=guoya \\
-Ddb.username=root \\
-Ddb.password=\${DB_PASSWORD} \\
-Dserver.port=\${SERVER_PORT} \\
/app/resume-core.jar
EOF
- 构建镜像:
docker build -t resume-app:1.0 .
- 查看镜像:
docker images
启动服务
(执行命令前请替换your_db_host为你环境中的mysql数据库IP地址)
docker run -d \
--name resume-container \
-p 8192:8192 \
-e DB_HOST=your_db_host \
-e DB_PASSWORD=com.guoyasoft \
resume-app:1.0
查看容器
docker ps
停止服务
docker stop resume-container # 停止容器
docker rm resume-container # 删除容器(可选)
重启服务
-
直接重启容器(适用于配置未变更):
docker restart resume-container
-
推荐方式(代码或配置更新后):
docker stop resume-container && docker rm resume-container docker build -t resume-app:1.1 . # 重新构建镜像 docker run -d \ --name resume-container \ -p 8192:8192 \ -e DB_HOST=your_db_host \ -e DB_PASSWORD=your_password \ resume-app:1.1
5. 四种方式对比与总结
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
直接运行 JAR | 简单快速 | 无进程管理,参数不安全,较难适应同主机同时运行不同JDK版本应用 | 本地测试、临时验证 |
Shell 脚本 | 参数集中管理,支持后台运行 | 依赖脚本维护,无环境隔离,较难适应同主机同时运行不同JDK版本应用 | 单机简单部署 |
Docker 挂载 | JAR 包与镜像分离,便于更新 | 需手动管理挂载路径 | 开发环境,频繁更新 JAR 包,同主机需要同时运行不同JDK版本应用 |
Docker 镜像构建 | 环境隔离,版本可控,适合生产 | 更新需重新构建镜像 | 生产环境,要求稳定性,隔离性,版本控制 |
通用环境依赖
- 数据库服务:MySQL 需运行且网络可达(IP:
DB_HOST
,端口3306
)。 - 防火墙配置:确保服务器开放
8192
端口(若需外部访问)。 - 敏感信息管理:避免在命令行或脚本中明文传递密码,推荐使用环境变量或 Secrets 工具。
最佳实践
- 开发调试:使用 Docker 挂载 JAR 包,快速更新代码并传递参数。
- 生产环境:使用 Dockerfile 构建镜像,结合 CI/CD 实现自动化部署。
- 临时验证:直接运行 JAR 或 Shell 脚本。
通过明确环境依赖和操作流程,可确保服务稳定运行并提升部署效率!
附录:
基础linux启动命令:
java -jar \
-Ddb.host=your_db_host \
-Ddb.port=3306 \
-Ddb.name=guoya \
-Ddb.username=root \
-Ddb.password=com.guoyasoft \
-Dserver.port=8192 \
/root/resume/resume-core-1.0-SNAPSHOT.jar
以下是解释这些参数,并说明它们如何与 Spring 配置文件中的属性对应。
1. Spring 配置文件(application.yml)解析
以下是配置文件的详细解释:
数据库配置 (db
)
db:
host: 106.14.138.58
port: 3306
name: guoya
username: root
password: com.guoyasoft
db.host
:数据库的主机地址(IP 或域名)。db.port
:数据库的端口号(默认 MySQL 是 3306)。db.name
:数据库的名称。db.username
:连接数据库的用户名。db.password
:连接数据库的密码。
应用程序配置 (app
)
app:
id: resume
app.id
:应用程序的唯一标识符,通常用于区分不同的服务实例。
服务器配置 (server
)
server:
port: 8192
server.port
:Spring Boot 应用程序的 HTTP 服务端口。
Spring 配置 (spring
)
spring:
application:
name: resume
datasource:
url: jdbc:mysql://${db.host}:${db.port}/${db.name}?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
username: ${db.username}
password: ${db.password}
dynamic:
hikari:
max-lifetime: 1800000
connection-timeout: 5000
idle-timeout: 3600000
max-pool-size: 12
min-idle: 4
connection-test-query: /**ping*/
spring.application.name
:应用程序的名称。spring.datasource.url
:数据库连接 URL,使用了${db.host}
、${db.port}
和${db.name}
占位符。spring.datasource.username
:数据库用户名,使用了${db.username}
占位符。spring.datasource.password
:数据库密码,使用了${db.password}
占位符。spring.datasource.dynamic.hikari
:Hikari 连接池的配置,包括最大生命周期、连接超时、空闲超时、最大连接池大小等。
日志配置 (logging
)
logging:
level:
com.company1.resume.mapper : debug
logging.level
:设置指定包(com.company1.resume.mapper
)的日志级别为debug
。
2. 命令参数与配置文件的对应关系
在命令中,-D
参数用于覆盖 Spring 配置文件中的占位符值。具体对应关系如下:
命令参数 | 配置文件中的占位符 | 说明 |
---|---|---|
-Ddb.host=your_db_host | ${db.host} | 覆盖数据库主机地址。 |
-Ddb.port=3306 | ${db.port} | 覆盖数据库端口号。 |
-Ddb.name=guoya | ${db.name} | 覆盖数据库名称。 |
-Ddb.username=root | ${db.username} | 覆盖数据库用户名。 |
-Ddb.password=com.guoyasoft | ${db.password} | 覆盖数据库密码。 |
-Dserver.port=8192 | server.port | 覆盖应用程序的 HTTP 服务端口。 |
3. 命令的作用
这个命令的作用是:
- 启动 Spring Boot 应用程序(
resume-core-1.0-SNAPSHOT.jar
)。 - 通过
-D
参数动态覆盖配置文件中的占位符值。- 例如,
-Ddb.host=your_db_host
会覆盖${db.host}
的值。
- 例如,
- 应用程序会使用这些动态传入的值初始化数据库连接和 HTTP 服务。
4. 示例:动态覆盖后的配置
假设命令中传入的参数如下:
-Ddb.host=192.168.1.100 \
-Ddb.port=3307 \
-Ddb.name=test_db \
-Ddb.username=admin \
-Ddb.password=secret \
-Dserver.port=8081
那么 Spring 配置文件中的占位符会被替换为:
spring:
datasource:
url: jdbc:mysql://192.168.1.100:3307/test_db?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
username: admin
password: secret
server:
port: 8081
5. 总结
-D
参数:用于动态覆盖 Spring 配置文件中的占位符值。- 配置文件:定义了默认值,但可以通过命令行参数动态修改。
- 动态配置的优势:可以在不修改配置文件的情况下,灵活调整应用程序的配置(如数据库连接、端口等)。
- 日志配置:单独设置日志级别,方便调试。
希望这个教程对你有帮助!如果还有其他问题,欢迎随时提问。
有服务器需求或学习需求的欢迎联系!!
(请备注来意)