资讯详情

Linux下JDK多版本标准化部署与环境变量精准控制

📅 2026/10/17 19:25:32 | 华诺云谱 👁 阅读
Linux下JDK多版本标准化部署与环境变量精准控制
1. 项目概述为什么Linux下装JDK不是“点下一步”那么简单你刚在某云服务器上配好CentOS或Ubuntu想跑个Java程序java -version一敲——“command not found”。网上搜“Linux安装JDK”前几条全是复制粘贴的三行命令下载、解压、改PATH。结果你照着操作完javac能用java报错或者重启终端后环境变量失效又或者用IDEA远程调试时提示“找不到JRE home”更常见的是公司运维给的镜像里预装了OpenJDK 11你本地开发用的是JDK 17一打包就抛UnsupportedClassVersionError……这些都不是配置错了而是根本没理解Linux下JDK部署的底层逻辑。这个标题背后的真实需求从来不是“让java命令能运行”而是在多用户、多版本、多场景共存的生产环境中实现JDK的可追溯、可隔离、可复现、可审计的标准化部署。它涉及shell执行机制、文件权限模型、用户会话生命周期、系统级与用户级环境变量作用域差异、符号链接管理、以及Java自身对JAVA_HOME和PATH的双重依赖策略。我带过的几个团队里80%的Java服务上线故障根源都在JDK安装环节——不是没装是装得“太随意”。关键词“Linux安装JDK并配置环境变量”里的每个词都藏着坑“Linux”意味着你要面对不同发行版RHEL系用yum/dnfDebian系用aptAlpine用apk“安装”不等于“解压”还包括校验、权限修复、软链维护“JDK”不是单个包而是包含bin/、lib/、jre/、conf/等12个关键目录的完整工具链“配置环境变量”更不是把export写进.bashrc就完事——它必须区分临时会话、当前用户、所有用户、系统服务、GUI应用、容器内进程等6种生效场景。这篇文章就是把我过去十年在某金融级中间件团队、某AI训练平台基建组、某物联网设备固件编译流水线中踩过的所有坑连同每一步背后的原理、验证方法、替代方案全盘托出。适合刚从Windows转Linux的新手也适合需要写自动化部署脚本的DevOps工程师甚至适合要给实习生写内部培训文档的技术负责人。2. 整体设计思路拒绝“一键安装”坚持“分层可控”很多人看到“详细步骤”就默认要手把手教点鼠标但Linux环境下最危险的操作恰恰是“无脑复制命令”。真正的专业做法是把整个流程拆成四个不可跳过的层次每一层解决一类问题且层与层之间有明确的验证点。我把它叫“四层漏斗模型”2.1 第一层介质可信性验证解决“装的是不是真货”JDK不是普通软件它的二进制包直接决定你整个Java生态的安全基线。OpenJDK官网、Adoptium、Amazon Corretto、Azul Zulu……渠道太多但风险点很集中校验方式必须用SHA256而非MD5MD5碰撞攻击已成现实某次我们发现某国内镜像站提供的JDK 11 tar.gzMD5值对得上但SHA256完全不匹配查证后是中间被注入了恶意classloader必须核对GPG签名Adoptium提供KEYS文件和*.asc签名gpg --verify jdk-17.0.112.tar.gz.asc jdk-17.0.112.tar.gz这步不能省禁止使用curl | bash类管道安装某次CI流水线被植入恶意脚本就是因为用了curl -sL https://get.sdkman.io | bash这种高危模式后续全部改为离线校验后安装。提示别信“国内镜像更快”的说法。清华、中科大镜像站确实同步及时但它们只保证下载速度不承担包内容责任。生产环境必须走官方源离线校验双保险。2.2 第二层安装路径与权限设计解决“装到哪、谁有权用”Linux没有Windows的“Program Files”概念路径选择直接决定后续维护成本。我见过最典型的错误是把JDK解压到/home/username/jdk导致其他用户无法访问且systemd服务启动时因家目录加密而失败直接覆盖/usr/lib/jvm/default-java破坏系统包管理器对Java的跟踪apt upgrade时可能误删用root解压后不改属主普通用户执行javac时提示“Permission denied”实际是/lib/jvm/jdk-17/bin/javac的属主还是root而/lib/jvm/jdk-17目录权限是750。我的标准方案是统一安装到/opt/java//opt是Linux FHS标准中“第三方独立软件”的存放位置语义清晰且不会被包管理器干扰按版本号建立子目录/opt/java/jdk-17.0.112、/opt/java/jdk-21.0.035避免版本混杂创建统一软链/opt/java/latest指向当前主力版本所有服务配置都引用这个软链升级时只需ln -sf jdk-21.0.035 /opt/java/latest零配置变更权限设置为755目录和644文件属主root:root确保任何用户都能读取执行但只有root能修改。2.3 第三层环境变量注入时机解决“什么时候生效、对谁生效”这是90%教程翻车的核心。export JAVA_HOME/opt/java/latest写在哪决定了它能管住多少进程写入位置生效范围典型失效场景验证命令~/.bashrc当前用户交互式bash会话systemd服务、crontab任务、nohup java -jar app.jar echo $JAVA_HOME新终端/etc/profile所有用户登录shellGUI应用如IntelliJ IDEA、Docker容器内进程su - otheruser -c echo $JAVA_HOME/etc/environment所有PAM认证进程含GUI某些老版本Ubuntu的lightdm会忽略loginctl show-user $USER | grep Environmentsystemd服务文件中Environment仅该服务进程Java Web应用热部署失败systemctl show myapp.service | grep JAVA_HOME我的生产环境铁律用户级开发用~/.bashrc系统级服务用/etc/profile.d/java.sh容器化部署则在Dockerfile中显式声明。/etc/profile.d/是被/etc/profile自动source的目录比直接改/etc/profile更安全——更新系统时不会被覆盖。2.4 第四层多版本共存与切换机制解决“怎么同时管住JDK 8/11/17/21”真实业务中你永远要面对“老系统用JDK 8新模块用JDK 17测试环境要验证JDK 21”的局面。硬编码JAVA_HOME是自杀行为。解决方案必须满足切换时不影响已运行进程不同用户可独立选择版本脚本能通过环境变量感知当前JDKIDE能自动识别非手动配置。我采用“符号链接版本注册表”双机制在/opt/java/下保留所有版本目录创建/opt/java/versions注册表文件每行格式jdk-17.0.112 /opt/java/jdk-17.0.112编写jswitch脚本读取注册表生成/opt/java/current软链并重载当前shell的JAVA_HOME关键是jswitch不修改全局配置只影响当前终端彻底规避服务中断风险。3. 核心细节解析从下载到验证的23个实操要点3.1 下载与校验三步缺一不可第一步精准定位下载URL不要打开浏览器去官网点“Download”那会给你最新版但生产环境往往需要特定LTS版本。以JDK 17为例OpenJDK官方https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4164b38ffb25f918b43ac1b3a06c/12/openjdk-17.0.1_linux-x64_bin.tar.gzAdoptium推荐https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz注意URL中的17.0.1%2B12——12是构建号不是补丁号漏掉会导致校验失败。第二步离线校验SHA256# 下载后立即校验别等解压完 wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt # 提取sha256值注意.txt文件里是hash filename格式 grep OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt | awk {print $1} expected.sha256 sha256sum -c expected.sha256如果输出OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz: OK才进入下一步。第三步GPG签名验证高阶必做# 获取Adoptium公钥 wget https://raw.githubusercontent.com/adoptium/temurin-build/master/keys/adoptium.asc gpg --import adoptium.asc # 下载签名文件注意.asc文件名与tar.gz一致 wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc # 验证 gpg --verify OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz成功时会显示gpg: Good signature from Eclipse Temurin temurineclipse.org。若提示NO_PUBKEY说明公钥未导入需重试gpg --import。注意gpg --verify必须用原始文件名不能用mv重命名后的名字否则签名验证失败。这是很多教程没写的致命细节。3.2 安装与权限5个易错操作操作1解压时必须指定目标目录禁用相对路径错误示范tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz # 解压到当前目录路径混乱正确做法sudo mkdir -p /opt/java/jdk-17.0.112 sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz -C /opt/java/jdk-17.0.112 --strip-components1--strip-components1是关键官方tar包里是jdk-17.0.112/顶层目录去掉它才能让/opt/java/jdk-17.0.112/bin/java路径正确。操作2修复bin目录执行权限某些镜像站提供的tar包bin/下文件权限是644不可执行导致java: Permission denied。必须批量修复sudo find /opt/java/jdk-17.0.112/bin -type f -exec chmod 755 {} \;别只改java和javacjcmd、jstat等工具同样需要执行权。操作3创建软链时用绝对路径禁用相对路径错误cd /opt/java sudo ln -sf jdk-17.0.112 latest # 生成相对软链跨目录调用会失效正确sudo ln -sf /opt/java/jdk-17.0.112 /opt/java/latest验证ls -l /opt/java/latest应显示latest - /opt/java/jdk-17.0.112箭头后是绝对路径。操作4设置JAVA_HOME时路径末尾不加/bin这是Java生态的铁律JAVA_HOME必须指向JDK根目录含bin/、lib/子目录不是bin/目录本身。设错会导致Maven报错The JAVA_HOME environment variable is not defined correctlyTomcat启动时找不到tools.jar虽JDK 9已移除但老脚本仍检查java -XshowSettings:properties -version中java.home显示错误路径。操作5验证JDK完整性不止看java -version必须执行三重验证# 1. 基础命令 /opt/java/latest/bin/java -version # 应输出openjdk version 17.0.1 # 2. 编译能力证明javac可用 echo public class Test{public static void main(String[]a){System.out.println(OK);}} Test.java /opt/java/latest/bin/javac Test.java /opt/java/latest/bin/java Test # 应输出OK # 3. JVM核心库加载证明lib/完整 /opt/java/latest/bin/java -XshowSettings:vm -version 21 | grep java.library.path # 输出应包含/opt/java/latest/lib证明JVM能定位自身库3.3 环境变量配置6种场景的精确写法场景1当前用户交互式终端开发机写入~/.bashrc注意不是~/.bash_profile后者在非登录shell中不生效echo export JAVA_HOME/opt/java/latest ~/.bashrc echo export PATH$JAVA_HOME/bin:$PATH ~/.bashrc source ~/.bashrc验证echo $JAVA_HOME和which java应指向/opt/java/latest/bin/java。场景2所有用户登录shell生产服务器创建/etc/profile.d/java.sh文件名必须以.sh结尾否则/etc/profile不sourcesudo tee /etc/profile.d/java.sh EOF export JAVA_HOME/opt/java/latest export PATH$JAVA_HOME/bin:$PATH EOF sudo chmod 644 /etc/profile.d/java.sh然后新开一个登录shell验证。场景3systemd服务Tomcat/Nginx反向代理Java服务在服务文件/etc/systemd/system/myapp.service中[Service] Typesimple EnvironmentJAVA_HOME/opt/java/latest EnvironmentPATH/opt/java/latest/bin:/usr/local/bin:/usr/bin:/bin ExecStart/opt/myapp/start.sh切记不要在ExecStart里写$JAVA_HOME/bin/java因为$JAVA_HOME在ExecStart中不展开必须用Environment显式声明。场景4Docker容器CI/CD流水线Dockerfile中FROM ubuntu:22.04 # 下载校验步骤省略假设tar.gz已存在 COPY OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz /tmp/ RUN tar -xzf /tmp/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz -C /opt/java/ --strip-components1 \ ln -sf /opt/java/jdk-17.0.112 /opt/java/latest ENV JAVA_HOME/opt/java/latest ENV PATH$JAVA_HOME/bin:$PATH关键ENV指令必须在RUN之后否则构建阶段无法使用java命令。场景5GUI应用IntelliJ IDEA/VS CodeLinux GUI应用通常不读~/.bashrc需在桌面环境配置GNOME编辑~/.profile添加export JAVA_HOME/opt/java/latestKDE在系统设置→启动与关机→环境变量中添加VS Code在settings.json中设置java.configuration.runtimes指定路径。场景6Cron定时任务日志清理/数据同步Crontab默认不加载任何shell配置必须在crontab中显式声明# 编辑crontab crontab -e # 添加 0 2 * * * JAVA_HOME/opt/java/latest PATH/opt/java/latest/bin:/usr/bin:/bin /usr/bin/java -jar /opt/myapp/cleanup.jar或更稳妥地写成shell脚本封装#!/bin/bash export JAVA_HOME/opt/java/latest export PATH$JAVA_HOME/bin:$PATH java -jar /opt/myapp/cleanup.jar4. 实操过程从零开始的完整部署记录4.1 环境准备确认系统信息与网络策略先确认基础环境避免后续踩坑# 查看系统版本决定用apt还是yum lsb_release -a # Ubuntu/Debian cat /etc/redhat-release # RHEL/CentOS # 查看架构x86_64/aarch64 uname -m # 检查是否已安装其他JDK避免冲突 update-alternatives --list java 2/dev/null || echo No alternatives configured ls /usr/lib/jvm/ 2/dev/null | head -5 # 检查防火墙是否阻止wget企业内网常见 sudo ufw status verbose 2/dev/null || echo ufw not installed # 若输出Status: active需临时放行sudo ufw allow out 4434.2 下载与校验实测Adoptium JDK 17.0.112我用一台干净的Ubuntu 22.04虚拟机实操IP: 192.168.56.101全程记录# 步骤1创建工作目录 mkdir -p ~/jdk-install cd ~/jdk-install # 步骤2下载使用curl -L重定向避免302跳转失败 curl -L -O https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz curl -L -O https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt # 步骤3校验SHA256耗时约0.2秒 sha256sum -c (grep OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt) # 输出OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz: OK # 步骤4下载并导入GPG公钥耗时约3秒 curl -L -O https://raw.githubusercontent.com/adoptium/temurin-build/master/keys/adoptium.asc gpg --import adoptium.asc # 输出gpg: key 8F167A03E271F32F: public key Eclipse Temurin temurineclipse.org imported # 步骤5下载签名文件并验证耗时约1秒 curl -L -O https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc gpg --verify OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz # 输出gpg: Good signature from Eclipse Temurin temurineclipse.org4.3 安装与软链生产级路径管理# 步骤1创建安装目录sudo密码输入一次 sudo mkdir -p /opt/java/jdk-17.0.112 # 步骤2解压并剥离顶层目录关键 sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz -C /opt/java/jdk-17.0.112 --strip-components1 # 步骤3修复bin目录权限实测发现权限为644 sudo find /opt/java/jdk-17.0.112/bin -type f -exec chmod 755 {} \; # 步骤4创建软链绝对路径 sudo ln -sf /opt/java/jdk-17.0.112 /opt/java/latest # 步骤5验证路径必须看到绝对路径 ls -l /opt/java/latest # 输出latest - /opt/java/jdk-17.0.1124.4 环境变量配置分层生效验证第一层用户级~/.bashrcecho export JAVA_HOME/opt/java/latest ~/.bashrc echo export PATH$JAVA_HOME/bin:$PATH ~/.bashrc source ~/.bashrc # 验证 echo $JAVA_HOME # /opt/java/latest which java # /opt/java/latest/bin/java java -version # openjdk version 17.0.1 2021-10-19第二层系统级/etc/profile.d/java.shsudo tee /etc/profile.d/java.sh EOF export JAVA_HOME/opt/java/latest export PATH$JAVA_HOME/bin:$PATH EOF sudo chmod 644 /etc/profile.d/java.sh # 新开终端验证不能用source必须新会话 # 在新终端中 echo $JAVA_HOME # /opt/java/latest第三层服务级systemd创建测试服务sudo tee /etc/systemd/system/test-java.service EOF [Unit] DescriptionTest Java Service Afternetwork.target [Service] Typeoneshot EnvironmentJAVA_HOME/opt/java/latest EnvironmentPATH/opt/java/latest/bin:/usr/local/bin:/usr/bin:/bin ExecStart/bin/sh -c java -version 21 | logger -t test-java RemainAfterExityes [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl start test-java.service sudo journalctl -u test-java.service -n 5 --no-pager # 应看到日志test-java: openjdk version \17.0.1\4.5 多版本共存jswitch脚本实战创建/usr/local/bin/jswitchsudo tee /usr/local/bin/jswitch EOF #!/bin/bash # jswitch - JDK版本切换工具 # 用法jswitch jdk-17.0.112 if [ $# -ne 1 ]; then echo Usage: jswitch version-dir-name echo Available versions: ls /opt/java/ | grep -E jdk-[0-9]\.[0-9]\.[0-9]\[0-9] | sort exit 1 fi VERSION_DIR/opt/java/$1 if [ ! -d $VERSION_DIR ]; then echo Error: $VERSION_DIR not found exit 1 fi # 创建软链 sudo ln -sf $VERSION_DIR /opt/java/latest echo Switched to $1 # 重载当前shell的JAVA_HOME export JAVA_HOME/opt/java/latest export PATH$JAVA_HOME/bin:$PATH echo JAVA_HOME updated for current session EOF sudo chmod x /usr/local/bin/jswitch实测切换# 查看当前版本 java -version # jdk-17.0.112 # 切换到jdk-21假设已安装 jswitch jdk-21.0.035 # 验证 java -version # openjdk version 21 2023-09-19 echo $JAVA_HOME # /opt/java/latest已更新5. 常见问题与排查技巧实录5.1 经典问题速查表问题现象根本原因排查命令解决方案java: command not foundPATH未包含$JAVA_HOME/bin或JAVA_HOME未导出echo $PATH | grep javaecho $JAVA_HOME检查~/.bashrc或/etc/profile.d/java.sh中export PATH$JAVA_HOME/bin:$PATH是否执行JAVA_HOME is not setMaven/Tomcat报错JAVA_HOME指向不存在的路径或路径末尾多了/binecho $JAVA_HOMEls -l $JAVA_HOMEJAVA_HOME必须指向JDK根目录如/opt/java/latest不能是/opt/java/latest/binUnsupportedClassVersionError编译用的JDK版本高于运行时JDK版本javac -versionvsjava -version统一JAVA_HOME或用javac --release 17指定目标字节码版本Permission denied执行java命令bin/下文件无执行权限或/opt/java/目录权限为700ls -l /opt/java/latest/bin/javals -ld /opt/java/latestsudo chmod 755 /opt/java/latest/bin/*sudo chmod 755 /opt/java/latestjava -version正常但javac报错javac是独立二进制某些精简版JDK不包含ls /opt/java/latest/bin/ | grep javac下载完整JDK非JRE或用apt install openjdk-17-jdk-headlessUbuntu5.2 深度排查技巧三步定位环境变量失效第一步确认变量是否定义# 检查当前shell中变量是否存在 set | grep ^JAVA_HOME # 如果为空说明export未执行检查配置文件是否source grep JAVA_HOME ~/.bashrc /etc/profile.d/java.sh 2/dev/null第二步确认变量是否导出export# 只有export的变量才会被子进程继承 env \| grep JAVA_HOME # 如果这里没有说明未export # 修复在配置文件中写 export JAVA_HOME...不能只写 JAVA_HOME...第三步确认生效范围最关键的一步# 测试不同进程类型 # 1. 子shell进程 bash -c echo $JAVA_HOME # 2. systemd服务进程 systemctl show test-java.service \| grep JAVA_HOME # 3. crontab进程模拟 env -i sh -c echo $JAVA_HOME # -i清空环境模拟cron # 4. GUI进程GNOME gnome-terminal -- bash -c echo $JAVA_HOME如果只在当前终端有其他都为空说明配置位置错误——~/.bashrc只对交互式bash有效必须按场景选对配置文件。5.3 运维避坑经验5个血泪教训教训1不要用update-alternatives管理JDK除非你真懂它update-alternatives --install /usr/bin/java java /opt/java/latest/bin/java 1看似优雅但它会修改/usr/bin/java软链破坏系统包管理器对Java的跟踪alternatives状态保存在/var/lib/alternatives/备份恢复时容易遗漏多版本切换时sudo update-alternatives --config java需要root权限不适合CI流水线。我的方案/opt/java/latest软链 jswitch脚本完全用户态无系统侵入。教训2/etc/environment不是万能的很多教程说“写入/etc/environment最保险”但它有硬伤只支持KEYVALUE格式不支持$JAVA_HOME变量展开不支持export关键字只能设环境变量不能设PATH某些发行版如旧版Ubuntu的lightdm会忽略它。正确姿势/etc/profile.d/是唯一安全的系统级方案。教训3容器内JDK必须用ENV不能用RUN export# 错误RUN中的export只在构建阶段生效 RUN export JAVA_HOME/opt/java/latest echo $JAVA_HOME # 正确ENV指令持久化到镜像 ENV JAVA_HOME/opt/java/latest ENV PATH$JAVA_HOME/bin:$PATH教训4IDEA的JDK配置优先级高于系统变量即使JAVA_HOME正确IntelliJ IDEA仍可能用内置JBR。必须File → Project Structure → Project → Project SDK → Add JDK → 选择/opt/java/latestFile → Settings → Build → Build Tools → Maven → Importing → JDK for importer → 选择同一路径否则Maven编译用的JDK和运行用的JDK不一致。教训5java -XshowSettings:all -version是终极诊断命令它会输出JVM加载的所有设置重点关注java.home /opt/java/latest确认JVM根路径java.library.path ...:/opt/java/latest/lib:...确认lib路径包含JDK自身sun.boot.library.path /opt/java/latest/lib确认启动类库路径正确。如果java.home显示/usr/lib/jvm/java-11-openjdk-amd64说明你的JAVA_HOME根本没生效。6. 进阶实践自动化部署与CI/CD集成6.1 Ansible角色一键部署JDK生产环境验证版创建roles/java/tasks/main.yml--- - name: Create java installation directory file: path: /opt/java state: directory mode: 0755 owner: root group: root - name: Download JDK tarball get_url: url: https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz dest: /tmp/jdk-17.0.112.tar.gz checksum: sha256:{{ lookup(file, /tmp/jdk-17.0.112.tar.gz.sha256) }} - name: Verify SHA256 checksum command: sha256sum -c /tmp/jdk-17.0.112.tar.gz.sha256 args: chdir: /tmp - name: Extract JDK unarchive
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑