在 Linux 上部署 Java 服务

环境要求

image.png

在 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)。
  • 构建上下文:需确保 Dockerfileresume-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=8192server.port覆盖应用程序的 HTTP 服务端口。

3. 命令的作用

这个命令的作用是:

  1. 启动 Spring Boot 应用程序(resume-core-1.0-SNAPSHOT.jar)。
  2. 通过 -D 参数动态覆盖配置文件中的占位符值。
    • 例如,-Ddb.host=your_db_host 会覆盖 ${db.host} 的值。
  3. 应用程序会使用这些动态传入的值初始化数据库连接和 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 配置文件中的占位符值。
  • 配置文件:定义了默认值,但可以通过命令行参数动态修改。
  • 动态配置的优势:可以在不修改配置文件的情况下,灵活调整应用程序的配置(如数据库连接、端口等)。
  • 日志配置:单独设置日志级别,方便调试。

希望这个教程对你有帮助!如果还有其他问题,欢迎随时提问。

有服务器需求或学习需求的欢迎联系!!
(请备注来意)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值