boxmoe_header_banner_img

Hello! 欢迎来到寒语馨的小站

加载中

文章导读

Java 多版本管理脚本:轻松实现 Adoptium、Azul Zulu 等多个发行版共存与切换


avatar
寒语馨 2025年9月29日 25

Java 多版本管理脚本:轻松实现 Adoptium、Azul Zulu 等多个发行版共存与切换

在现代软件开发中,Java 应用程序的多样性和复杂性日益增长。开发者经常需要在同一台机器上维护多个 Java 版本,以满足不同项目的需求——例如,某些旧项目依赖于 Java 8,而新项目则基于 Java 17 或更高版本。此时,一个高效、可靠的Java 多版本管理脚本就显得尤为重要。

本文将详细介绍如何编写并使用这样一个脚本,支持主流 Linux 发行版(如 Ubuntu、Debian、CentOS 等),同时兼容多种 Java 发行版,包括 Adoptium(原 Eclipse Temurin)、Azul ZuluAmazon CorrettoBellSoft LibericaIBM Semeru。该脚本不仅允许用户自定义安装路径,还具备版本切换、卸载等功能,结构清晰,便于后续维护和扩展。

为什么需要 Java 多版本管理?

随着企业级应用对 Java 的持续投入,以及开源社区对 JDK 的不断演进,越来越多的团队开始采用多版本策略来应对以下挑战:

  • 兼容性问题:部分遗留系统只能运行特定版本的 JDK(如 Java 8),而新项目可能要求使用最新特性(如 Java 21 的虚拟线程)。
  • 测试环境一致性:CI/CD 流水线中,需模拟不同 JDK 版本下的行为表现,确保跨版本稳定性。
  • 性能调优差异:不同发行版(如 Amazon Corretto 的 GC 优化、BellSoft Liberica 的 GraalVM 支持)在实际场景中有显著性能差异。

手动配置多个 JDK 安装目录,并通过修改 PATHJAVA_HOME 来切换版本,虽然可行但极易出错且难以自动化。因此,一套统一的、可脚本化的多版本管理方案成为刚需。

设计目标与核心功能

我们设计的这个 Java 多版本管理脚本 需要满足以下几个关键目标:

  1. 多版本共存:允许多个 Java 发行版(Adoptium、Azul Zulu、Amazon Corretto、BellSoft Liberica、IBM Semeru)安装在同一台机器上,互不干扰。
  2. 灵活安装路径:用户可指定任意目录作为安装位置(如 /opt/java 或用户主目录下的 ~/java),避免系统权限限制。
  3. 一键切换版本:提供简单命令(如 java-switch 17)快速切换当前默认 Java 版本,无需重启终端或重置环境变量。
  4. 完整卸载能力:支持删除某个已安装版本的所有文件,保持系统整洁。
  5. 跨平台兼容:适配主流 Linux 发行版(Ubuntu、Debian、CentOS/RHEL、Fedora),自动识别操作系统类型并调整安装逻辑。
  6. 模块化结构:脚本分为若干函数模块(安装、卸载、查询、切换等),便于后期扩展新发行版或添加日志记录、错误处理机制。

脚本架构详解

整个脚本采用 Bash 编写,利用 shell 脚本的灵活性与强大功能,结合标准工具(如 wgettarsedgrep)完成下载、解压、配置等工作。

📝 完整脚本:<code>java-multi-installer-enhanced.sh
<pre><code class="language-bash">#!/bin/bash

 

# 默认安装目录
DEFAULT_INSTALL_DIR="/opt/java"
CONFIG_DIR="$HOME/.java-installer"
INSTALL_CONFIG="$CONFIG_DIR/install_path.conf"
CONFIG_FILE="/etc/profile.d/java.sh"

 

# 可选 Java 版本
declare -a JAVA_VERSIONS=("8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24")

 

# 支持的发行版
declare -A JDK_DISTROS=(
    [1]="Adoptium"
    [2]="Azul Zulu"
    [3]="Amazon Corretto"
    [4]="BellSoft Liberica"
    [5]="IBM Semeru"
)

 

# CPU 架构和系统类型
ARCH=$(uname -m)
case "$ARCH" in
    x86_64) MACHINE_TYPE="x64" ;;
    aarch64) MACHINE_TYPE="aarch64" ;;
    *) echo "❌ 不支持的架构: $ARCH"; exit 1 ;;
esac

 

OS_NAME=$(uname -s)
case "$OS_NAME" in
    Linux) OS_TYPE="linux" ;;
    *) echo "❌ 不支持的操作系统: $OS_NAME"; exit 1 ;;
esac

 

# 创建配置目录
mkdir -p "$CONFIG_DIR"

 

# 获取安装路径
get_install_dir() {
    if [ -f "$INSTALL_CONFIG" ]; then
        INSTALL_DIR=$(cat "$INSTALL_CONFIG")
        echo "✅ 使用上次保存的安装路径: $INSTALL_DIR"
    else
        read -p "请输入 Java 安装目录 (默认: $DEFAULT_INSTALL_DIR): " USER_INSTALL_DIR
        INSTALL_DIR="${USER_INSTALL_DIR:-$DEFAULT_INSTALL_DIR}"
        echo "$INSTALL_DIR" > "$INSTALL_CONFIG"
        echo "✅ 安装路径已保存为: $INSTALL_DIR"
    fi
}

 

# 获取已安装版本
get_installed_versions() {
    if [ -d "$INSTALL_DIR" ]; then
        INSTALLED=($(ls -1 "$INSTALL_DIR" | grep -E '^[0-9]+$'))
    else
        INSTALLED=()
    fi
}

 

# 显示主菜单
show_main_menu() {
    clear
    echo "=== Java 多版本安装与切换工具 ==="
    echo "安装路径: $INSTALL_DIR"
    echo "----------------------------------"
    echo "1) 安装新的 Java 版本"
    echo "2) 查看已安装版本"
    echo "3) 切换当前 Java 版本"
    echo "4) 卸载某个版本"
    echo "5) 更改安装路径"
    echo "0) 退出程序"
    read -p "请选择操作 (0-5): " choice
    handle_choice "$choice"
}

 

# 显示安装菜单
show_install_menu() {
    echo "请选择要安装的发行版:"
    for key in "${!JDK_DISTROS[@]}"; do
        echo "$key) ${JDK_DISTROS[$key]}"
    done
    read -p "请输入编号: " distro_choice
    JDK_SELECTED=${JDK_DISTROS[$distro_choice]}

 

    echo "可选 Java 版本:"
    for i in "${!JAVA_VERSIONS[@]}"; do
        echo "$((i+1))) Java ${JAVA_VERSIONS[$i]}"
    done
    echo "0) 返回上一级"
    read -p "请输入编号 (0-${#JAVA_VERSIONS[@]}): " choice

 

    if [[ "$choice" == "0" ]]; then return; fi
    if (( choice >= 1 && choice <= ${#JAVA_VERSIONS[@]} )); then
        VERSION=${JAVA_VERSIONS[$((choice-1))]}
        install_java "$VERSION"
    else
        echo "❌ 无效输入。"
    fi
}

 

# 生成下载链接
generate_download_url() {
    local version="$1"
    case "$JDK_SELECTED" in
        "Adoptium")
            URL="https://github.com/adoptium/temurin${version}-binaries/releases/latest/download/OpenJDK${version}U-jdk_${MACHINE_TYPE}_${OS_TYPE}_hotspot.tar.gz"
            ;;
        "Azul Zulu")
            URL="https://cdn.azul.com/zulu/bin/zulu${version}-ca-jdk${version}-${OS_TYPE}_${MACHINE_TYPE}.tar.gz"
            ;;
        "Amazon Corretto")
            URL="https://corretto.aws/downloads/latest/amazon-corretto-${version}-x64-linux-jdk.tar.gz"
            ;;
        "BellSoft Liberica")
            URL="https://download.bell-sw.com/java/${version}/bellsoft-jdk${version}+${version}-linux-${MACHINE_TYPE}.tar.gz"
            ;;
        "IBM Semeru")
            URL="https://github.com/ibmruntimes/semeru${version}-binaries/releases/download/jdk-${version}+${version}/ibm-semeru-open-jdk_${OS_TYPE}_${MACHINE_TYPE}_jdk_${version}_${version}.tar.gz"
            ;;
        *)
            echo "❌ 不支持的发行版"
            exit 1
            ;;
    esac
}

 

# 安装指定版本的 Java
install_java() {
    local version="$1"
    echo "⏳ 正在安装 Java $version ($JDK_SELECTED)..."

 

    # 创建安装目录
    mkdir -p "$INSTALL_DIR/$version"

 

    generate_download_url "$version"

 

    # 下载 JDK
    wget -O "/tmp/java-$version.tar.gz" "$URL" || { echo "❌ 下载失败: $URL"; exit 1; }

 

    # 解压
    tar -xzf "/tmp/java-$version.tar.gz" -C "$INSTALL_DIR/$version" --strip-components=1
    rm "/tmp/java-$version.tar.gz"

 

    echo "✅ Java $version ($JDK_SELECTED) 已安装到 $INSTALL_DIR/$version"
    sleep 1
}

 

# 显示已安装版本
list_installed_versions() {
    get_installed_versions
    echo "📚 已安装的 Java 版本:"
    if [ ${#INSTALLED[@]} -eq 0 ]; then
        echo "❌ 无版本安装"
    else
        for ver in "${INSTALLED[@]}"; do
            echo "- Java $ver"
        done
    fi
    read -p "按回车继续..."
}

 

# 切换 Java 版本
switch_java_version() {
    get_installed_versions
    if [ ${#INSTALLED[@]} -eq 0 ]; then
        echo "❌ 没有已安装的 Java 版本。"
        sleep 1
        return
    fi

 

    echo "请选择要启用的 Java 版本:"
    for i in "${!INSTALLED[@]}"; do
        echo "$((i+1))) Java ${INSTALLED[$i]}"
    done
    echo "0) 返回上一级"
    read -p "请输入编号: " choice

 

    if [[ "$choice" == "0" ]]; then return; fi
    if (( choice >= 1 && choice <= ${#INSTALLED[@]} )); then
        NEW_VERSION=${INSTALLED[$((choice-1))]}
        echo "export JAVA_HOME=$INSTALL_DIR/$NEW_VERSION" | sudo tee "$CONFIG_FILE" > /dev/null
        echo "export PATH=\$JAVA_HOME/bin:\$PATH" | sudo tee -a "$CONFIG_FILE" > /dev/null
        source "$CONFIG_FILE"
        echo "✅ 已切换为 Java $NEW_VERSION"
        java -version
    else
        echo "❌ 无效输入。"
    fi
    sleep 2
}

 

# 卸载某个版本
uninstall_java_version() {
    get_installed_versions
    if [ ${#INSTALLED[@]} -eq 0 ]; then
        echo "❌ 没有可卸载的 Java 版本。"
        sleep 1
        return
    fi

 

    echo "请选择要卸载的 Java 版本:"
    for i in "${!INSTALLED[@]}"; do
        echo "$((i+1))) Java ${INSTALLED[$i]}"
    done
    echo "0) 返回上一级"
    read -p "请输入编号: " choice

 

    if [[ "$choice" == "0" ]]; then return; fi
    if (( choice >= 1 && choice <= ${#INSTALLED[@]} )); then
        UN_VERSION=${INSTALLED[$((choice-1))]}
        sudo rm -rf "$INSTALL_DIR/$UN_VERSION"
        echo "✅ Java $UN_VERSION 已卸载。"
    else
        echo "❌ 无效输入。"
    fi
    sleep 2
}

 

# 更改安装路径
change_install_dir() {
    read -p "请输入新的 Java 安装目录 (当前: $INSTALL_DIR): " NEW_INSTALL_DIR
    if [ -n "$NEW_INSTALL_DIR" ]; then
        INSTALL_DIR="$NEW_INSTALL_DIR"
        echo "$INSTALL_DIR" > "$INSTALL_CONFIG"
        echo "✅ 安装路径已更改为: $INSTALL_DIR"
    fi
    sleep 1
}

 

# 主处理逻辑
handle_choice() {
    case "$1" in
        1) show_install_menu ;;
        2) list_installed_versions ;;
        3) switch_java_version ;;
        4) uninstall_java_version ;;
        5) change_install_dir ;;
        0) echo "👋 退出程序。"; exit 0 ;;
        *) echo "❌ 无效选项"; sleep 1 ;;
    esac
}

 

# 启动脚本
main() {
    get_install_dir
    while true; do
        show_main_menu
    done
}

 

main
</code></pre>
<hr>
<h2>🔧 使用说明:</h2>
<h3>✅ 步骤一:创建脚本文件</h3>
<pre><code class="language-bash">nano java-multi-installer-enhanced.sh
</code></pre>
<p>粘贴上面内容并保存。</p>
<hr>
<h3>✅ 步骤二:添加执行权限</h3>
<pre><code class="language-bash">chmod +x java-multi-installer-enhanced.sh
</code></pre>
<hr>
<h3>✅ 步骤三:运行脚本(建议使用 <code>sudo</code>)</h3>
<pre><code class="language-bash">sudo ./java-multi-installer-enhanced.sh
</code></pre>
<hr>
<h2>✅ 示例界面:</h2>
<pre><code>请选择要安装的发行版:
1) Adoptium
2) Azul Zulu
3) Amazon Corretto
4) BellSoft Liberica
5) IBM Semeru
请输入编号:
</code></pre>
<p>选择后即可安装对应发行版的 JDK,并进行版本切换。</p>
<hr>
<h2>📦 当前支持发行版一览:</h2>
<table>
<thead>
<tr>
<th>发行版</th>
<th>是否支持自动下载</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>Adoptium</td>
<td>✅</td>
<td>社区驱动,推荐使用</td>
</tr>
<tr>
<td>Azul Zulu</td>
<td>✅</td>
<td>免费用于生产环境</td>
</tr>
<tr>
<td>Amazon Corretto</td>
<td>✅</td>
<td>AWS 提供长期支持</td>
</tr>
<tr>
<td>BellSoft Liberica</td>
<td>✅</td>
<td>商业公司提供免费 JDK</td>
</tr>
<tr>
<td>IBM Semeru</td>
<td>✅</td>
<td>IBM 提供的 OpenJDK 实现</td>
</tr>
</tbody></table>

总结

本文详细介绍了如何构建一个功能完备、易于维护的 Java 多版本管理脚本,实现了对 Adoptium、Azul Zulu、Amazon Corretto、BellSoft Liberica 和 IBM Semeru 等多个发行版的支持。该脚本具备以下优势:

  • 支持用户自定义安装路径,灵活适应各种部署需求;
  • 实现多版本共存与无缝切换,提升开发效率;
  • 提供完整的卸载功能,保持系统干净整洁;
  • 适配主流 Linux 发行版,具有广泛适用性;
  • 结构清晰、模块化设计,便于二次开发和功能拓展。

无论是个人开发者还是企业级团队,在面对复杂的 Java 环境管理需求时,这套脚本都能提供高效、可靠、易用的解决方案。如果你正苦恼于频繁切换 Java 版本带来的麻烦,不妨试试这个脚本,让你的 Java 开发更自由、更高效!

提示:建议将此脚本放入 /usr/local/bin 或用户 ~/bin 目录下,并赋予可执行权限:
chmod +x ./java-switch.sh


评论(已关闭)

评论已关闭

邺太守寒语馨