还在用 OpenJDK 或 Oracle JDK?国产化改造、鲲鹏适配、大数据场景 GC 调优,毕昇JDK全都能搞定!
用一键脚本安装毕昇JDK,自动选版本(JDK 8/11/17/21)、自动下载、自动配置环境变量,启停/切版本/卸载/健康检查,一个交互菜单全搞定!
无需 Docker,无需 yum/apt,自动从华为云镜像站下载官方二进制包,原生 CentOS 7 即用!
/usr/local/bishengjdk/<版本>/etc/profile.d/bishengjdk.sh,全局生效/usr/local/bishengjdk/jdk8/usr/local/bishengjdk/jdk11/usr/local/bishengjdk/jdk17/usr/local/bishengjdk/jdk21第一步:复制以下脚本内容,保存到服务器
#!/bin/bash# ============================================================# 毕昇JDK 一键安装管理脚本# 系统要求:CentOS 7 x86_64# 功能:多版本安装/切换/卸载/环境变量管理# 公众号:运维AI实战营# ============================================================set -euo pipefail# ─── 颜色定义 ───────────────────────────────────────────────RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'BLUE='\033[0;34m'CYAN='\033[0;36m'NC='\033[0m'log_info() { echo -e "${BLUE}[INFO] $*${NC}"; }log_ok() { echo -e "${GREEN}[OK] $*${NC}"; }log_warn() { echo -e "${YELLOW}[WARN] $*${NC}"; }log_err() { echo -e "${RED}[ERR] $*${NC}"; }# ─── 全局配置 ────────────────────────────────────────────────BASE_DIR="/usr/local/bishengjdk"ENV_FILE="/etc/profile.d/bishengjdk.sh"MIRROR_BASE="https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk"# 各版本最新稳定包(华为云镜像站实际路径)declare -A JDK_VERSIONS=( [8]="8u482" [11]="11.0.26" [17]="17.0.16" [21]="21.0.8")declare -A JDK_FILENAMES=( [8]="bisheng-jdk-8u482-b13-linux-x64.tar.gz" [11]="bisheng-jdk-11.0.30-b12-linux-x64.tar.gz" [17]="bisheng-jdk-17.0.18-b13-linux-x64.tar.gz" [21]="bisheng-jdk-21.0.10-b13-linux-x64.tar.gz")declare -A JDK_URLS=( [8]="${MIRROR_BASE}/${JDK_FILENAMES[8]}" [11]="${MIRROR_BASE}/${JDK_FILENAMES[11]}" [17]="${MIRROR_BASE}/${JDK_FILENAMES[17]}" [21]="${MIRROR_BASE}/${JDK_FILENAMES[21]}")# ─── 工具函数 ────────────────────────────────────────────────check_root() { if [ "$(id -u)" != "0" ]; then log_err "请使用 root 用户运行此脚本" exit 1 fi}check_arch() { local arch arch=$(uname -m) if [ "$arch" != "x86_64" ]; then log_warn "当前架构:$arch(脚本针对 x86_64 优化,aarch64 请手动修改下载地址)" read -r -p "是否继续?[y/N]: " ans [[ "$ans" =~ ^[Yy]$ ]] || exit 0 else log_ok "架构检查通过:$arch" fi}check_deps() { local missing=() for cmd in wget tar; do command -v "$cmd" &>/dev/null || missing+=("$cmd") done if [ ${#missing[@]} -gt 0 ]; then log_err "缺少依赖:${missing[*]},请先执行:yum install -y ${missing[*]}" exit 1 fi log_ok "依赖检查通过"}# ─── 获取当前激活版本 ─────────────────────────────────────────get_active_version() { if [ -L "${BASE_DIR}/current" ]; then readlink "${BASE_DIR}/current" | sed 's|.*/jdk||' else echo "未设置" fi}# ─── 获取已安装版本列表 ───────────────────────────────────────list_installed() { local installed=() for v in 8 11 17 21; do if [ -f "${BASE_DIR}/jdk${v}/bin/java" ]; then installed+=("$v") fi done echo "${installed[@]}"}# ─── 下载毕昇JDK ─────────────────────────────────────────────download_jdk() { local version="$1" local filename="${JDK_FILENAMES[$version]}" local url="${JDK_URLS[$version]}" local tarball="/tmp/${filename}" local install_dir="${BASE_DIR}/jdk${version}" if [ -f "${install_dir}/bin/java" ]; then log_warn "JDK ${version} 已安装于 ${install_dir},跳过下载" return 0 fi log_info "准备安装毕昇JDK ${version}(${JDK_VERSIONS[$version]})" log_info "下载地址:${url}" # 清理旧临时文件 rm -f "$tarball" # 下载(不用管道,正确判断返回码) wget -O "$tarball" "$url" 2>&1 | grep -E "^[0-9]|HTTP|Length|saved" || true # 验证下载 if [ ! -f "$tarball" ] || [ ! -s "$tarball" ]; then log_warn "华为云镜像下载失败,尝试备用地址..." local alt_url="https://github.com/openeuler-mirror/bishengjdk-build/releases/download/${JDK_VERSIONS[$version]}/${filename}" wget -O "$tarball" "$alt_url" 2>&1 | grep -E "^[0-9]|HTTP|Length|saved" || true fi if [ ! -f "$tarball" ] || [ ! -s "$tarball" ]; then log_err "下载失败!" log_err "请手动下载后放至 /tmp/${filename} 再重新运行" log_err "官方下载页:https://www.hikunpeng.com/zh/developer/devkit/compiler/jdk" rm -f "$tarball" exit 1 fi local fsize fsize=$(du -h "$tarball" | awk '{print $1}') log_ok "下载完成(${fsize})" # 解压安装 log_info "正在解压至 ${install_dir}..." mkdir -p "${BASE_DIR}" rm -rf "${install_dir}.tmp" mkdir -p "${install_dir}.tmp" tar -xzf "$tarball" -C "${install_dir}.tmp" --strip-components=1 mv "${install_dir}.tmp" "${install_dir}" # 清理 rm -f "$tarball" log_ok "JDK ${version} 安装完成:${install_dir}"}# ─── 设置激活版本 ─────────────────────────────────────────────activate_version() { local version="$1" local install_dir="${BASE_DIR}/jdk${version}" if [ ! -f "${install_dir}/bin/java" ]; then log_err "JDK ${version} 未安装,请先安装" return 1 fi # 更新软链接 ln -snf "${install_dir}" "${BASE_DIR}/current" # 更新环境变量文件 cat > "$ENV_FILE" << EOF# 毕昇JDK 环境变量(由 bishengjdk-install.sh 自动生成)export JAVA_HOME=${install_dir}export PATH=\$JAVA_HOME/bin:\$PATHexport CLASSPATH=.:\$JAVA_HOME/libEOF source "$ENV_FILE" 2>/dev/null || true log_ok "已激活 JDK ${version},环境变量已写入 ${ENV_FILE}" log_info "请执行 source /etc/profile.d/bishengjdk.sh 或重开终端使环境变量生效" log_info "当前 Java 版本验证:" "${install_dir}/bin/java" -version 2>&1 | head -3}# ─── 卸载指定版本 ─────────────────────────────────────────────uninstall_version() { local version="$1" local install_dir="${BASE_DIR}/jdk${version}" local active_ver active_ver=$(get_active_version) if [ ! -d "${install_dir}" ]; then log_warn "JDK ${version} 未安装,无需卸载" return 0 fi echo -e "${YELLOW}⚠️ 即将删除:${install_dir}${NC}" read -r -p "确认卸载 JDK ${version}?[y/N]: " ans [[ "$ans" =~ ^[Yy]$ ]] || { log_info "取消卸载"; return 0; } rm -rf "${install_dir}" log_ok "JDK ${version} 目录已删除" # 如果卸载的是当前激活版本,清理软链和环境变量 if [ "$active_ver" = "$version" ]; then rm -f "${BASE_DIR}/current" rm -f "$ENV_FILE" log_warn "已清除当前激活版本和环境变量,请重新激活其他版本" fi}# ─── 查看已安装版本 ───────────────────────────────────────────show_installed() { local active_ver active_ver=$(get_active_version) echo -e "\n${CYAN}━━━━━━ 已安装的毕昇JDK 版本 ━━━━━━${NC}" local found=0 for v in 8 11 17 21; do local dir="${BASE_DIR}/jdk${v}" if [ -f "${dir}/bin/java" ]; then found=1 local java_ver java_ver=$("${dir}/bin/java" -version 2>&1 | head -1 | awk -F '"' '{print $2}') if [ "$active_ver" = "$v" ]; then echo -e " ${GREEN}▶ JDK ${v} — ${java_ver} [当前激活]${NC}" else echo -e " ${BLUE} JDK ${v} — ${java_ver}${NC}" fi fi done [ "$found" -eq 0 ] && echo -e " ${YELLOW}暂无已安装版本${NC}" echo ""}# ─── JVM 健康检测 ─────────────────────────────────────────────jvm_health() { local active_ver active_ver=$(get_active_version) if [ "$active_ver" = "未设置" ]; then log_warn "未激活任何 JDK 版本" return 1 fi local java_bin="${BASE_DIR}/jdk${active_ver}/bin/java" echo -e "\n${CYAN}━━━━━━ JVM 健康检测 ━━━━━━${NC}" # Java 版本 echo -e "${BLUE}[Java 版本]${NC}" "$java_bin" -version 2>&1 echo "" # JVM 默认堆大小 echo -e "${BLUE}[JVM 默认堆参数]${NC}" "$java_bin" -XX:+PrintFlagsFinal -version 2>/dev/null | grep -E "InitialHeapSize|MaxHeapSize|MaxMetaspaceSize" | \ awk '{printf " %-30s = %s\n", $2, $4}' || echo " 无法获取堆参数" echo "" # JVM GC 类型 echo -e "${BLUE}[JVM GC 配置]${NC}" "$java_bin" -XX:+PrintCommandLineFlags -version 2>&1 | tr ' ' '\n' | grep -E "GC|gc" | head -5 || echo " 使用默认 GC" echo "" log_ok "JVM 健康检测完成"}# ─── 主菜单 ───────────────────────────────────────────────────main_menu() { while true; do local active_ver active_ver=$(get_active_version) clear echo -e "${CYAN}" echo " ╔══════════════════════════════════════════╗" echo " ║ 毕昇JDK 安装管理工具 ║" echo " ║ 公众号:运维AI实战营 ║" echo " ╚══════════════════════════════════════════╝" echo -e "${NC}" echo -e " 当前激活版本:${GREEN}JDK ${active_ver}${NC}" echo "" echo " ──── 安装管理 ────" echo " 1) 安装 JDK 8 (企业主流,推荐传统应用)" echo " 2) 安装 JDK 11 (长期支持,推荐新项目)" echo " 3) 安装 JDK 17 (长期支持,推荐 Spring Boot 3+)" echo " 4) 安装 JDK 21 (最新 LTS,推荐虚拟线程)" echo " 5) 安装全部版本(JDK 8/11/17/21)" echo "" echo " ──── 版本切换 ────" echo " 6) 切换激活版本" echo " 7) 查看已安装版本" echo "" echo " ──── 运维工具 ────" echo " 8) JVM 健康检测" echo " 9) 卸载指定版本" echo " 10) 清空环境变量" echo "" echo " 0) 退出" echo "" read -r -p " 请输入选项: " choice echo "" case "$choice" in 1) install_jdk_interactive 8 ;; 2) install_jdk_interactive 11 ;; 3) install_jdk_interactive 17 ;; 4) install_jdk_interactive 21 ;; 5) for v in 8 11 17 21; do install_jdk_interactive "$v" done # 安装全部后激活最新稳定LTS(JDK17) if [ -f "${BASE_DIR}/jdk17/bin/java" ]; then log_info "批量安装完成,默认激活 JDK 17" activate_version 17 fi ;; 6) switch_version_menu ;; 7) show_installed ;; 8) jvm_health ;; 9) uninstall_menu ;; 10) clear_env ;; 0) echo -e "${GREEN}再见!${NC}"; exit 0 ;; *) log_warn "无效输入,请重新选择" ;; esac echo "" read -r -p " 按 Enter 返回主菜单..." _ done}# ─── 安装并激活 ───────────────────────────────────────────────install_jdk_interactive() { local version="$1" download_jdk "$version" if [ -f "${BASE_DIR}/jdk${version}/bin/java" ]; then read -r -p " 是否立即激活 JDK ${version} 为默认版本?[Y/n]: " ans if [[ ! "$ans" =~ ^[Nn]$ ]]; then activate_version "$version" fi fi}# ─── 切换版本菜单 ─────────────────────────────────────────────switch_version_menu() { show_installed local installed installed=$(list_installed) if [ -z "$installed" ]; then log_warn "请先安装至少一个版本" return 0 fi echo " 可切换版本:$installed" read -r -p " 请输入要激活的版本号(8/11/17/21): " ver case "$ver" in 8|11|17|21) activate_version "$ver" ;; *) log_warn "无效版本号" ;; esac}# ─── 卸载菜单 ─────────────────────────────────────────────────uninstall_menu() { show_installed read -r -p " 请输入要卸载的版本号(8/11/17/21): " ver case "$ver" in 8|11|17|21) uninstall_version "$ver" ;; *) log_warn "无效版本号" ;; esac}# ─── 清空环境变量 ─────────────────────────────────────────────clear_env() { echo -e "${YELLOW}⚠️ 即将删除环境变量文件:${ENV_FILE}${NC}" read -r -p "确认清空?[y/N]: " ans [[ "$ans" =~ ^[Yy]$ ]] || { log_info "取消操作"; return 0; } rm -f "$ENV_FILE" rm -f "${BASE_DIR}/current" log_ok "环境变量已清除,重新打开终端生效"}# ─── 入口 ────────────────────────────────────────────────────main() { check_root check_arch check_deps main_menu}main第二步:保存脚本并执行
# 将上方脚本内容保存为文件并赋权vi /usr/local/bin/bishengjdk-install.sh# (粘贴内容后 :wq 保存退出)chmod +x /usr/local/bin/bishengjdk-install.shbash /usr/local/bin/bishengjdk-install.sh复制上方脚本内容,在服务器执行:
vi /usr/local/bin/bishengjdk-install.sh# 按 i 进入编辑模式,粘贴脚本内容,按 Esc 后输入 :wq 保存chmod +x /usr/local/bin/bishengjdk-install.shbash /usr/local/bin/bishengjdk-install.sh
进入交互菜单后,根据需要选择:
1) 安装 JDK 8 ← 传统企业应用、老项目2) 安装 JDK 11 ← Spring Boot 2.x、微服务推荐3) 安装 JDK 17 ← Spring Boot 3+、现代项目推荐4) 安装 JDK 21 ← 最新LTS、虚拟线程 Loom5) 一键安装全部四个版本安装激活后,执行:
source /etc/profile.d/bishengjdk.shjava -version预期输出示例(JDK 17):
openjdk version "17.0.16" 2025-07-15OpenJDK Runtime Environment BiSheng (build 17.0.16+11)OpenJDK 64-Bit Server VM BiSheng (build 17.0.16+11, mixed mode, sharing)安装多个版本后,通过菜单 选项 6 随时切换:
bash /usr/local/bin/bishengjdk-install.sh# 选 6 → 输入 11 → 立即切换为 JDK 11source /etc/profile.d/bishengjdk.shjava -version # 验证当前版本✅ 安装目录结构:
/usr/local/bishengjdk/├── jdk8/ ← JDK 8 安装目录├── jdk11/ ← JDK 11 安装目录├── jdk17/ ← JDK 17 安装目录├── jdk21/ ← JDK 21 安装目录└── current -> jdk17/ ← 当前激活版本软链✅ 环境变量文件:
cat /etc/profile.d/bishengjdk.sh# export JAVA_HOME=/usr/local/bishengjdk/jdk17# export PATH=$JAVA_HOME/bin:$PATH✅ JVM 健康检测输出示例:
[Java 版本]openjdk version "17.0.16" ...[JVM 默认堆参数] InitialHeapSize = 128MB MaxHeapSize = 2GB[JVM GC 配置] -XX:+UseG1GC (默认G1)✅ arm使用脚本安装:
arm架构也可直接修改脚本如下信息
declare -A JDK_FILENAMES=( [8]="bisheng-jdk-8u482-b13-linux-aarch64.tar.gz" [11]="bisheng-jdk-11.0.30-b12-linux-aarch64.tar.gz" [17]="bisheng-jdk-17.0.18-b13-linux-aarch64.tar.gz" [21]="bisheng-jdk-21.0.10-b13-linux-aarch64.tar.gz")Q:下载速度很慢怎么办?
华为云镜像站国内直连一般速度不错。若仍慢,可手动下载 tar.gz 包放至
/tmp/目录,脚本检测到本地文件会自动跳过下载。
Q:能否用于生产环境?
毕昇JDK是华为内部使用的OpenJDK下游版本,已在华为业务中大规模验证,完全兼容OpenJDK,可用于生产环境。
Q:多版本共存会冲突吗?
不会。各版本安装在独立目录,通过软链和环境变量文件切换,互不干扰。
Q:和 OpenJDK / Oracle JDK 有什么区别?
毕昇JDK 100% 兼容 OpenJDK,在 ARM/鲲鹏架构、大数据 GC 等场景有额外优化,可直接替换 OpenJDK 使用。
📌 运维AI实战营 — 无依赖、一键用、已验证
觉得有用?点赞 + 收藏,评论"毕昇JDK"获取脚本原文 👇