在同一个服务器上部署两个使用不同JDK版本的服务,以JDK1.8、JDK17为例
今天遇到这样一个情况,有两个使用不同jdk版本的java服务需要部署到同一台服务器上,考虑将这两个不同版本的jdk通过systemd(或其他进程管理工具)注册为服务,后续启动的时候便可以通过这两个服务来确保两套环境互不干扰、服务能够顺利启动。
- 前置准备:把两套 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 路径。
- 为每个服务准备独立的启动脚本
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)让进程脱离终端。
将日志重定向到独立文件,便于排查。
- 使用 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。
- 统一管理、开机自启、异常自动重启。

被折叠的 条评论
为什么被折叠?



