如何在同一个服务器上部署两个使用不同JDK版本的服务,以JDK1.8、JDK17为例

在同一个服务器上部署两个使用不同JDK版本的服务,以JDK1.8、JDK17为例

今天遇到这样一个情况,有两个使用不同jdk版本的java服务需要部署到同一台服务器上,考虑将这两个不同版本的jdk通过systemd(或其他进程管理工具)注册为服务,后续启动的时候便可以通过这两个服务来确保两套环境互不干扰、服务能够顺利启动。

  1. 前置准备:把两套 JDK 安装到独立目录
步骤操作说明
1.1下载对应 JDK(OpenJDK、Oracle JDK、Alibaba Dragonwell 等)例如:JDK 8:/opt/jdk8 JDK 17:/opt/jdk17
1.2解压或使用包管理器安装到上述目录确保目录结构完整(bin/java、bin/javac、lib 等)
1.3给目录设置合适的权限(chmod -R 755 /opt/jdk8)让运行服务的用户(如 appuser)有执行权限

提示:如果服务器是 Linux(CentOS、Ubuntu 等),可以使用 update-alternatives 管理全局默认 JDK,但不要把它当成唯一的 JDK;后面会通过脚本/systemd 明确指定每个服务使用的 JDK 路径。

  1. 为每个服务准备独立的启动脚本
    2.1 示例目录结构
/opt/app/
├─ serviceA/          # 需要 JDK 1.8 的服务
│   ├─ lib/           # jar 包、依赖
│   └─ start.sh
└─ serviceB/          # 需要 JDK 17 的服务
    ├─ lib/
    └─ start.sh

2.2 serviceA/start.sh(JDK 1.8)

#!/bin/bash
# 指定 JDK 8
export JAVA_HOME=/opt/jdk8
export PATH=$JAVA_HOME/bin:$PATH

# 可选:打印版本确认
echo "=== ServiceA 使用的 Java 版本 ==="
java -version

# 启动命令(示例)
nohup java -jar /opt/app/serviceA/lib/serviceA.jar \
      --spring.config.location=/opt/app/serviceA/conf/application.yml \
      > /opt/app/serviceA/logs/stdout.log 2>&1 &

2.3 serviceB/start.sh(JDK 17)

#!/bin/bash
# 指定 JDK 17
export JAVA_HOME=/opt/jdk17
export PATH=$JAVA_HOME/bin:$PATH

# 可选:打印版本确认
echo "=== ServiceB 使用的 Java 版本 ==="
java -version

# 启动命令(示例)
nohup java -jar /opt/app/serviceB/lib/serviceB.jar \
      --spring.config.location=/opt/app/serviceB/conf/application.yml \
      > /opt/app/serviceB/logs/stdout.log 2>&1 &

要点

每个脚本都 显式 设置 JAVA_HOME 与 PATH,确保后续的 java 命令指向对应 JDK。
使用 nohup(或 screen、tmux)让进程脱离终端。
将日志重定向到独立文件,便于排查。

  1. 使用 systemd(或其他进程管理工具)注册为服务
    3.1 serviceA.service(JDK 1.8)
[Unit]
Description=Java Service A (JDK 1.8)
After=network.target

[Service]
Type=simple
User=appuser               # 运行服务的系统用户
WorkingDirectory=/opt/app/serviceA
ExecStart=/opt/app/serviceA/start.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

3.2 serviceB.service(JDK 17)

[Unit]
Description=Java Service B (JDK 17)
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/app/serviceB
ExecStart=/opt/app/serviceB/start.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

部署步骤

# 复制 unit 文件到 systemd 目录
sudo cp serviceA.service /etc/systemd/system/
sudo cp serviceB.service /etc/systemd/system/

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动并设置开机自启
sudo systemctl start serviceA
sudo systemctl enable serviceA

sudo systemctl start serviceB
sudo systemctl enable serviceB

# 查看状态
sudo systemctl status serviceA
sudo systemctl status serviceB

为什么使用 systemd?

  • 自动守护、日志收集(journalctl -u serviceA)。
  • 启动时会执行完整的 ExecStart 脚本,确保每个服务使用自己指定的 JDK。
  • 统一管理、开机自启、异常自动重启。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.EscaRC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值