Alibaba Cloud Linux 安装JDK 指南

Alibaba Cloud Linux 3.2 系统安装配置JDK指南

什么是openJDK

OpenJDK(Open Java Development Kit)是Java 开发工具包的开源实现,由 Oracle 主导、全球社区共同维护,也是 Oracle JDK 的核心开源基础(Oracle JDK 基于 OpenJDK 构建,仅增加少量闭源组件)。它是 Java 平台的官方开源版本,遵循 GPL v2 许可证(带 Classpath 例外),可免费用于商业和非商业场景。

一、核心特点

开源免费:无商业许可费用,可自由下载、修改、分发,适合企业级生产环境。
与标准兼容:完全遵循 Java SE 规范,保证代码的跨平台性和兼容性。
版本同步:与 Oracle JDK 版本号同步(如 JDK 8、11、17、21),LTS(长期支持)版本生命周期与 Oracle 一致(如 JDK 17 LTS 支持至 2029 年)。
社区驱动:由 Oracle、RedHat、Amazon、Google、Alibaba等企业和社区贡献者共同维护。

二、OpenJDK 与 Oracle JDK 的核心区别

维度 OpenJDK Oracle JDK
许可证 GPL v2 + Classpath 例外 商业许可(2019 年后收费)
功能 无闭源组件(如飞行记录器早期版本) 包含少量闭源组件(如商业支持、飞行记录器)
更新支持 社区 / 厂商维护(如 RedHat、Amazon、Alibaba) Oracle 官方付费支持
稳定性 与 Oracle JDK 核心一致 略优(闭源组件测试更充分)

注:Oracle JDK 免费仅用于开发 / 测试,生产环境需付费;OpenJDK 无此限制。

三 安装 openJDK

openJDK 采用 Alibaba 进行安装
官网地址: https://www.aliyun.com/product/dragonwell?spm=5176.30204012.nav-v2-dropdown-menu-1.d_main_16_0_2.643158d7vMo5gV&scm=20140722.X_data-8e84283a578d2c93371a._.V_1

image.png

点击了解更多进入 Alibaba Dragonwell 下载页面


image.png
Dragonwell 版本 代表JDK版本
Dragonwell 8 JDK8
Dragonwell 11 JDK 11
Dragonwell 21 JDK 21

产品功能:

  • Dragonwell Standard Edition
    基于OpenJDK上游,包含更多的增强,比如:bug-fixing, security patches, tooling support等。
  • Dragonwell Extended Edition
    标准版之上的增强版,包含了大量的面向云计算环境优化的定制特性,例如 Wisp2、JWarmup、Multi-Tenant、ElasticHeap 等。这些特性都在阿里生产环境得到大规模验证。

3.1 右键下载按钮 复制链接地址下载 tar

wget https://dragonwell.oss-cn-shanghai.aliyuncs.com/8.27.26-test-dragonwell_extended/Alibaba_Dragonwell_Extended_8.27.26_x64_linux.tar.gz

3.2 解压

创建解压目录

mkdir -p /opt/openJdk-8

解压

tar -zvxf Alibaba_Dragonwell_Extended_8.27.26_x64_linux.tar.gz -C /opt/openJdk-8 --strip-components=1

3.3 环境配置

3.3.1 编辑环境变量配置文件
vim /etc/profile
3.3.2 vim编辑器操作步骤
  • 按 i 键 进入 INSERT 模式(插入模式)
  • 使用方向键或鼠标滚轮滚动到文件 最后一行
  • 添加以下配置内容(根据您的实际路径修改):

输入以下

# ==================== Java Environment ====================
export JAVA_HOME=/opt/openJdk-8
export PATH=$JAVA_HOME/bin:$PATH
# ==========================================================

重要提示:
请将 /opt/openJdk-8替换为您的 实际JDK路径

3.3.3 保存并退出vim:
  • 按 ESC 键退出编辑模式

  • 输入 :wq 并按回车键(保存并退出)

3.3.4 重新加载配置
source /etc/profile

3.4 进行安装测试

java -version

3.5 卸载

删除 1.3 环境配置 删除 压缩包 即可完成卸载

四 多个jdk 版本切换

PS: 根据上面教程安装多个jdk

4.1 创建环境变量

创建环境变量配置文件

sudo vim /etc/profile.d/jdks.sh

添加以下内容

# 变量名格式必须是 JAVA_{版本号}_HOME
# 如需继续添加其它JDK 版本 往下添加
# JDK 8 
export JAVA_8_HOME=/opt/openJdk-8
# JDK 21
export JAVA_21_HOME=/opt/openJdk-21

# 添加了JDk 版本以下函数不需要进行改动,会自动检测
# 定义切换JDK版本的函数 
function setjdk() {
    # 检查是否提供了版本参数
    if [ -z "$1" ]; then
        # 如果没有提供参数,显示当前JAVA_HOME和所有已配置的JDK版本
        echo "当前 JAVA_HOME: $JAVA_HOME"
        echo "已检测到的 JDK 版本:"
        
        # 遍历所有以JAVA_开头、以_HOME结尾的环境变量(这些变量存储了各JDK的安装路径)
        for var_name in $(compgen -v | grep '^JAVA_.*_HOME$'); do
            # 从变量名中提取版本号:移除前缀"JAVA_"和后缀"_HOME"
            version="${var_name#JAVA_}"
            version="${version%_HOME}"
            # 显示版本号和对应的安装路径
            echo "  $version: ${!var_name}"
        done
        return
    fi
    
    # 如果提供了参数,根据参数构造目标JDK的环境变量名
    # 例如:输入"8" -> 变量名"JAVA_8_HOME"
    target_var="JAVA_${1}_HOME"
    
    # 使用间接变量引用检查目标JDK变量是否存在
    # ${!target_var} 在bash中表示引用名为target_var值的变量
    if [ -z "${!target_var}" ]; then
        # 如果变量不存在或为空,提示错误并显示所有可用版本
        echo "错误: JDK 版本 $1 未配置"
        echo "已检测到的 JDK 版本:"
        for var_name in $(compgen -v | grep '^JAVA_.*_HOME$'); do
            version="${var_name#JAVA_}"
            version="${version%_HOME}"
            echo "  $version"
        done
        return 1  # 返回非零状态表示错误
    fi
    
    # 第一部分:清理PATH,移除所有JDK相关的路径
    
    # 1. 保存当前PATH到局部变量current_path
    local current_path="$PATH"
    # 初始化一个空字符串来存储清理后的系统路径
    local system_path=""
    
    # 2. 将PATH按冒号分隔符拆分成数组
    # IFS是内部字段分隔符,这里临时设置为冒号
    # read -ra将读取的字符串分割后存入数组path_parts
    IFS=':' read -ra path_parts <<< "$current_path"
    
    # 3. 收集所有已配置的JDK的bin目录路径
    # 初始化一个空数组jdk_paths来存储所有JDK的bin目录
    local jdk_paths=()
    # 遍历所有JAVA_*_HOME变量
    for var_name in $(compgen -v | grep '^JAVA_.*_HOME$'); do
        # 将每个JDK的bin目录路径添加到jdk_paths数组中
        # ${!var_name}获取变量的值,然后拼接"/bin"
        jdk_paths+=("${!var_name}/bin")
    done
    
    # 4. 重建PATH,过滤掉所有JDK的bin目录路径
    # 遍历PATH中的每个路径片段
    for part in "${path_parts[@]}"; do
        # 标记当前片段是否为JDK路径,初始值为0(不是)
        local is_jdk_path=0
        
        # 检查当前路径片段是否与任何JDK的bin目录匹配
        for jdk_path in "${jdk_paths[@]}"; do
            # 如果匹配,标记为JDK路径并跳出循环
            if [[ "$part" == "$jdk_path" ]]; then
                is_jdk_path=1
                break
            fi
        done
        
        # 如果当前路径不是JDK路径且不为空,则将其添加到清理后的系统路径中
        if [[ $is_jdk_path -eq 0 ]] && [[ -n "$part" ]]; then
            if [[ -z "$system_path" ]]; then
                # 如果system_path为空,直接赋值
                system_path="$part"
            else
                # 否则用冒号连接新路径
                system_path="$system_path:$part"
            fi
        fi
    done
    
    # 第二部分:设置新的PATH和JAVA_HOME
    
    # 1. 设置新的PATH:将目标JDK的bin目录放在最前面,后面接清理后的系统路径
    # ${!target_var}获取目标JDK的安装路径,然后拼接"/bin"
    export PATH="${!target_var}/bin:$system_path"
    
    # 2. 更新JAVA_HOME环境变量为目标JDK的安装路径
    export JAVA_HOME="${!target_var}"
    
    
    # 第三部分:修改系统配置文件中的JAVA_HOME
    update_config() {
        # 显示可用配置文件列表
        echo ""
        echo "请选择要修改的配置文件:"
        echo "1) /etc/bashrc"
        echo "2) /etc/profile"
        echo "0) 跳过,不修改任何文件"
        
        read -r -p "请选择 (0-2): " choice
        
        case $choice in
            1)
                local profile_file="/etc/bashrc"
                ;;
            2)
                local profile_file="/etc/profile"
                ;;
            0|*)
                echo "跳过配置文件修改。"
                return 0
                ;;
        esac
        
        # 检查配置文件是否存在,不存在则创建
        if [ ! -f "$profile_file" ]; then
            echo "配置文件 $profile_file 不存在"
          return 1
        fi
        
        # 备份原文件 如需要 去掉注释
        #cp "$profile_file" "${profile_file}.backup.$(date +%Y%m%d_%H%M%S)"
        #echo "已创建备份文件: ${profile_file}.backup.$(date +%Y%m%d_%H%M%S)"
        
        # 检查文件中是否已存在 JAVA_HOME 设置
        if grep -q '^export JAVA_HOME=' "$profile_file"; then
            # 如果存在,使用 sed 替换现有行
            sed -i "s|^export JAVA_HOME=.*|export JAVA_HOME=\"${!target_var}\"|" "$profile_file"
            echo "已修改配置文件 $profile_file 中的 JAVA_HOME 设置"
        else
            # 如果不存在,在文件末尾添加完整的 JAVA 环境设置
           echo "" >> "$profile_file"
           echo "# JAVA 环境设置,由 setjdk 函数自动生成" >> "$profile_file"
           echo "export JAVA_HOME=\"${!target_var}\"" >> "$profile_file"
           echo "export PATH=\"\$JAVA_HOME/bin:\$PATH\"" >> "$profile_file"
           echo "已在配置文件 $profile_file 中添加 JAVA 环境设置"
        fi
        
        echo "请执行 'source $profile_file' 使永久设置生效"
    }
    # 第四部分:输出切换结果并验证
    
    # 显示切换成功的消息
    echo "已切换到 JDK $1"
    # 执行java -version命令验证切换是否成功
    java -version
}

4.2 重新加载配置

source /etc/profile.d/jdks.sh

4.3 使用示例

查看支持的版本

setjdk
image.png

切换版本

setjdk 21
image.png

尝试切换到不支持的版本

setjdk 22
image.png

长久生效

update_config
image.png

选择之前配置的JAVA环境的配置文件,请确认路径是否一致 PS:我之前配置java环境是 /etc/profile 配置文件


image.png

根据提示 执行 source /etc/profile 文件即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容