shell脚本自动安装 JDK 1.8

  • A+
所属分类:Shell
#!/bin/bash

# JDK 1.8 安装脚本(华为云镜像,修复解压验证)
if [ "$(id -u)" -ne 0 ]; then
    echo "请用root权限运行(sudo ./install_jdk8.sh)"
    exit 1
fi

# 安装依赖
yum install -y wget >/dev/null 2>&1

# 定义变量
JDK_URL="https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz"
INSTALL_PATH="/usr/local"
TEMP_FILE="/tmp/jdk8.tar.gz"
JAVA_BIN="$INSTALL_PATH/jdk/bin/java"

# 下载函数(带重试机制)
download_jdk() {
    echo "正在从华为云镜像下载JDK 1.8..."
    local attempt=1
    local max_attempts=3
    
    while [ $attempt -le $max_attempts ]; do
        echo "尝试下载 ($attempt/$max_attempts)..."
        
        # 适配旧版wget
        wget -q $JDK_URL -O $TEMP_FILE
        
        # 检查文件是否存在且非空
        if [ -f "$TEMP_FILE" ] && [ -s "$TEMP_FILE" ]; then
            # 验证文件大小(华为云JDK 8u202大约为180MB)
            FILE_SIZE=$(du -m "$TEMP_FILE" | cut -f1)
            if [ "$FILE_SIZE" -lt 150 ]; then
                echo "警告:下载文件大小异常 ($FILE_SIZE MB),可能不完整"
                rm -f $TEMP_FILE
            else
                echo "下载完成 (大小: $FILE_SIZE MB)"
                return 0
            fi
        else
            echo "下载文件不存在或为空,尝试重新下载..."
            rm -f $TEMP_FILE
        fi
        
        attempt=$((attempt + 1))
        sleep 2
    done
    
    echo "错误:下载失败,请检查网络连接或URL是否有效"
    return 1
}

# 执行下载
download_jdk || exit 1

# 解压
echo "正在解压JDK..."
mkdir -p "$INSTALL_PATH/jdk_tmp"
tar -zxf $TEMP_FILE -C "$INSTALL_PATH/jdk_tmp"
if [ $? -ne 0 ]; then
    echo "错误:解压失败,可能是文件损坏"
    rm -rf "$INSTALL_PATH/jdk_tmp"
    rm -f $TEMP_FILE
    exit 1
fi

# 验证解压内容
JDK_DIR=$(ls -d "$INSTALL_PATH/jdk_tmp/jdk1.8.0_202" 2>/dev/null)
if [ -z "$JDK_DIR" ] || [ ! -d "$JDK_DIR/bin" ]; then
    echo "错误:解压后未找到JDK目录或bin目录缺失"
    echo "解压内容:"
    ls -la "$INSTALL_PATH/jdk_tmp"
    rm -rf "$INSTALL_PATH/jdk_tmp"
    rm -f $TEMP_FILE
    exit 1
fi

# 清理旧的软连接和目录
if [ -L "$INSTALL_PATH/jdk" ]; then
    echo "移除旧的软连接: /usr/local/jdk"
    rm -f "$INSTALL_PATH/jdk"
elif [ -d "$INSTALL_PATH/jdk" ]; then
    echo "移除旧的目录: /usr/local/jdk"
    rm -rf "$INSTALL_PATH/jdk"
fi

# 移动到目标位置并创建软连接
echo "将JDK移动到目标位置..."
mv "$JDK_DIR" "$INSTALL_PATH/jdk1.8.0_202"
rm -rf "$INSTALL_PATH/jdk_tmp"
ln -s "$INSTALL_PATH/jdk1.8.0_202" "$INSTALL_PATH/jdk"
echo "创建软连接: /usr/local/jdk → $INSTALL_PATH/jdk1.8.0_202"

# 清理临时文件
rm -f $TEMP_FILE

# 配置环境变量
ENV_FILE="/etc/profile.d/jdk.sh"
cat > $ENV_FILE << EOF
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=.:\$JAVA_HOME/lib:\$JRE_HOME/lib
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 验证环境变量配置
echo "验证环境变量配置..."
if ! grep -q "JAVA_HOME=/usr/local/jdk" $ENV_FILE; then
    echo "错误:环境变量配置失败"
    exit 1
fi

# 加载环境变量(当前会话)
source $ENV_FILE

# 验证JDK安装
echo "验证JDK安装..."
if [ ! -x "$JAVA_BIN" ]; then
    echo "错误:JDK二进制文件不存在或不可执行"
    echo "请检查: $JAVA_BIN"
    echo "目录内容:"
    ls -la "$INSTALL_PATH/jdk/bin"
    exit 1
fi

# 验证Java版本
echo "验证Java版本..."
JAVA_VERSION=$($JAVA_BIN -version 2>&1 | grep version | awk '{print $3}' | tr -d '"')

if [[ "$JAVA_VERSION" == *"1.8.0_202"* ]]; then
    echo "JDK 1.8.0_202 安装成功"
    echo "版本信息:"
    $JAVA_BIN -version
    echo "JAVA_HOME: $JAVA_HOME"
    echo "PATH: $PATH"
else
    echo "安装失败:Java版本验证失败"
    echo "检测到版本: $JAVA_VERSION"
    echo "请检查: $JAVA_BIN"
    exit 1
fi
shell脚本自动安装 JDK 1.8
xxx