下载链接:Java Archive | Oracle 中国

more jdk.sh
#!/bin/bash
set -e

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 清理旧的或损坏的文件
clean_old_files() {
    echo -e "${YELLOW}正在清理旧文件和可能的损坏文件...${NC}"

    # 清理/tmp目录中超过1天的 jdk 压缩包
    find /tmp -name '*jdk*.tar.gz' -mtime +1 -delete

    # 清理文件名包含 ?AuthParam 的文件
    find /tmp -name '*jdk*?AuthParam=*' -delete

    # 清理系统其他目录中命名不规范的 jdk 压缩包
    find / -name '*jdk*.tar.gz?AuthParam=*' -delete 2>/dev/null
    find / -name '*jdk*.tar.gz' ! -name '*.tar.gz' -delete 2>/dev/null

    echo -e "${GREEN}清理完成。${NC}"
}

# 清理旧文件
clean_old_files

# 提示用户输入下载链接
read -p "请输入JDK下载链接(直接回车跳过下载步骤): " download_link

# 如果用户输入了链接,则下载JDK
if [ ! -z "$download_link" ]; then
    echo "正在下载JDK..."
    filename=$(basename "$download_link")
    # 移除文件名中的查询参数部分
    clean_filename=$(echo "$filename" | sed 's/\?.*//')

    # 使用 curl 下载并添加必要的头信息
    curl -L -b "oraclelicense=accept-securebackup-cookie" -o "/tmp/$clean_filename" "$download_link"

    if [ $? -ne 0 ]; then
        echo -e "${RED}下载失败,请检查链接是否正确。${NC}"
        exit 1
    fi
    echo -e "${GREEN}下载完成。${NC}"
fi

# 查找 JDK 压缩包所在目录,并将设置为变量 JAVA
JAVA=$(find / -name 'jdk*tar.gz' -type f -print0 2>/dev/null | xargs -0 ls -t | head -n 1 | xargs dirname)

# 查找 JDK 压缩包的名字,设置为变量 JDK
JDK=$(find / -name 'jdk*tar.gz' -type f -print0 2>/dev/null | xargs -0 ls -t | head -n 1 | xargs basename)

# 如果没有找到JDK压缩包,退出脚本
if [ -z "$JAVA" ] || [ -z "$JDK" ]; then
    echo -e "${RED}未找到有效的JDK压缩包,请确保已下载正确的文件。${NC}"
    exit 1
fi

# 打印 JDK 压缩包目录和文件
echo -e "${GREEN}JAVA Directory: $JAVA${NC}"
echo -e "${GREEN}JDK File: $JDK${NC}"

# 切换到压缩包所在目录
cd "$JAVA"

# 验证文件格式是否为 gzip
if ! gzip -t "$JDK" > /dev/null 2>&1; then
    echo -e "${RED}文件不是有效的 gzip 格式。${NC}"
    exit 1
fi

# 解压到 /usr/local/ 目录下
tar xf "$JDK" -C /usr/local/
if [ $? -ne 0 ]; then
  echo -e "${RED}解压 $JDK 失败。${NC}"
  exit 1
fi

# 找到解压后的目录名,并设置为变量 JDKAPP
JDKAPP=$(find /usr/local/ -maxdepth 1 -type d -name 'jdk*' | sort -V | tail -n 1 | xargs basename)
echo -e "${GREEN}JDKAPP Directory: $JDKAPP${NC}"

# 检查解压后的目录是否存在
if [ -z "$JDKAPP" ]; then
  echo -e "${RED}未找到解压后的JDK目录。${NC}"
  exit 1
fi

# 做软链接,便于 shell 环境识别命令
ln -sfn /usr/local/"$JDKAPP" /usr/local/jdk

# 创建环境变量文件
cat > /etc/profile.d/jdk.sh << EOF
export JAVA_HOME=/usr/local/jdk
export PATH=\$JAVA_HOME/bin:\$PATH
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=\$JAVA_HOME/lib/:\$JRE_HOME/lib/
EOF

# 定义一个函数来应用环境变量
apply_env() {
    source /etc/profile.d/jdk.sh
    if command -v java &>/dev/null; then
        echo -e "${GREEN}JDK环境变量已成功应用到当前会话。${NC}"
        echo -e "${GREEN}当前Java版本:${NC}"
        java -version
    else
        echo -e "${YELLOW}无法在当前shell会话中识别java命令。${NC}"
        echo -e "${YELLOW}请检查安装是否成功,或尝试重新登录。${NC}"
    fi
}

echo -e "${GREEN}JDK安装和配置已完成。${NC}"
echo -e "${YELLOW}要立即在当前会话中应用新的环境变量,请执行以下命令:${NC}"
echo -e "${GREEN}source /etc/profile.d/jdk.sh${NC}"

# 询问用户是否要立即应用环境变量
read -p "是否要立即应用环境变量?(y/n) " answer
if [[ $answer == [Yy]* ]]; then
    apply_env
else
    echo -e "${YELLOW}环境变量将在下次登录时生效,或者您可以稍后手动执行 'source /etc/profile.d/jdk.sh'。${NC}"
fi
chmod 755 jdk.sh