ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux手动安装OpenJDK全流程:下载、配置环境变量与排坑指南

Linux手动安装OpenJDK全流程:下载、配置环境变量与排坑指南 去年在客户那边部署一套Java服务遇上了个挺尴尬的场景机器是最小化安装的CentOS 7内网隔离外网不通运维那边给的包管理源里又没有现成的Java运行时。翻了一圈文档最后还是老老实实走最原始的路子——在Linux上手动安装OpenJDK。整个过程不算复杂但坑是真不少。这篇文章就把手动安装OpenJDK的完整思路、步骤和我在实操中踩过的雷一次性讲清楚适合所有需要在Linux服务器上自己装Java环境的人不管你是刚入门还是已经部署过好几台机器应该都能从中找到点有用的东西。1. 放着好好的yum/apt不用为什么非要手动装很多人第一反应是装个Java而已yum install java-1.8.0-openjdk一行命令搞定为什么非要手动下载、解压、配环境变量这么折腾这个想法本身没错但只适用于那些系统能联网、包管理源够新、版本要求不苛刻的场景。手动安装看起来原始却恰恰是生产环境里最省心、最可控的方式。1.1 包管理器装Java的方便是相对的包管理器确实方便但这份方便有几个前提你的机器能访问到软件源软件源里正好有你需要的JDK版本而且你不介意这个版本被系统的维护节奏绑架。就拿CentOS 7举例默认源里的Java版本常年停留在8u201左右某些第三方源能提供11但你得为了一个Java去引入额外的源配置这在生产环境里意味着额外的信任风险和版本漂移风险。用yum install装Java还有个大问题它会把Java拆成若干个独立包比如java-1.8.0-openjdk、java-1.8.0-openjdk-devel、java-1.8.0-openjdk-headless。很多人装完发现javac没有就是因为只装了JRE部分忘了装-devel包。同理yum默认给你装的是headless版本如果你要用AWT相关的图形界面库又会遇到一堆依赖问题。这些包管理的隐性成本平时不说真到出问题的时候挺浪费时间的。手动安装的核心逻辑是你直接把整个JDK目录交给系统它不依赖任何包管理机制也不受系统源版本的影响。一个tar.gz解压出来就是完整的JDKjava和javac天然都在目录结构清清楚楚想换版本删目录就行不留一点残留。1.2 手动安装真正解决的几类场景概括下来手动安装OpenJDK主要解决四类场景的需求。第一是内网隔离环境。很多政企和生产服务器根本不允许访问外网yum、apt在这种环境里基本属于瘫痪状态。你只能在一台能上网的机器上把JDK压缩包下载好然后通过各种手段拷进目标服务器。这种场景下手动安装不是选择而是唯一出路。第二是版本精确锁定。生产环境讲究可重复性你今天用apt install openjdk-17-jdk装了17半年后再执行同一命令装的可能是17.0.6而你需要的是17.0.2。版本漂移在开发环境无所谓在预发布和生产环境却可能引发诡异的行为差异。手动安装一个固定版本的tar包整个团队的运行环境就能做到百分之百一致。第三是多版本共存。如果一台机器上要同时跑JDK 8和JDK 17的项目包管理器会很别扭。系统里只能有一个默认的JDK注册装第二个版本基本要靠你手动处理。手动安装天然支持任意数量版本共存目录分开放切换切换只需要改环境变量。第四是交叉编译和深度定制。有些嵌入式Linux系统、国产化操作系统它们的包管理源里可能压根没有OpenJDK或者版本老旧到无法支持新框架。手动下载对应架构的包直接解压是最直接的绕过源问题的方案。1.3 手动安装的代价也就是你必须接受的说了手动安装这么多好处也得说清楚它的代价不然就是忽悠人。最大的代价是升级和安全更新得自己管。包管理器虽然版本滞后但至少yum update的时候会顺手把安全补丁打了。手动安装的JDK是游离在包管理之外的它不会自动更新你需要在心里留个提醒定期关注OpenJDK的安全通告及时手动替换新的版本。其次手动安装没有依赖识别能力。一个tar包解压出来能不能跑取决于系统里有没有它依赖的glibc、fontconfig等底层库。缺少依赖的时候不像apt那样会自动帮你装上你需要自己ldd去查、yum install去补。还有一点容易被忽略手动安装的JDK不会自动设置JAVA_HOME和PATH。你得自己写环境变量而且写不对还会引出一堆莫名其妙的问题。很多人安装失败不是下载环节出错而是环境变量配置环节翻车。后面我会重点展开这部分。总的来说手动安装的适用边界很清楚你追求的是可控、精确、稳定愿意为此承担手动管理版本和依赖的责任。它比包管理器多花十分钟但省下的可能是上线前踩坑的一天。2. 动手之前先弄明白OpenJDK的版本和包类型别下载完才发现不对这一节是很多教程会跳过的部分但恰恰是最容易让人原地打转的地方。OpenJDK的版本命名、发行渠道、压缩包格式、CPU架构任何一个环节搞错装出来的环境都不能用。我见过太多人拿着一个x86的包往ARM服务器上解压折腾一上午最后报错报得一头雾水。2.1 版本号里的小九九LTS版本和安全更新先讲版本选择。OpenJDK每半年发布一个功能版本每隔两年左右发布一个LTS长期支持版本。LTS版本才是生产环境该用的因为它们有持续的安全更新和修复。当前主流的LTS版本是JDK 8、JDK 11、JDK 17JDK 21也已经进入LTS序列。选哪个版本主要取决于你的项目。老项目、大数据生态比如Hadoop、Spark对JDK 8的支持最成熟新项目、Spring Boot 3.x和主流云原生框架基本都推荐JDK 17。如果你不知道该选哪个就选JDK 17这是目前兼容性和性能最均衡的选择。版本号本身也有讲究。一个典型的版本号长这样17.0.27。前面的17是大版本中间的0.2是安全更新级别后面的7是构建编号。手动安装的时候尽量选择17.0.x里面最新的安全更新版而不是只看大版本号。比如17.0.2和17.0.6之间差了好几个安全补丁功能层面差别不大但安全性天差地别。这里还有一个很多人不知道的点OpenJDK的下载页面上有GAGeneral Availability正式发布版和EAEarly Access早期预览版之分。手动装生产环境只认GA版本EA版本是给开发者尝鲜用的里面可能有已知Bug性能也没有经过充分调优。2.2 下载渠道的选择记住这几个就够OpenJDK的下载渠道挺多但正规、可靠的就那么几个。第一个是OpenJDK官方网站网址是jdk.java.net这是OpenJDK社区自己维护的构建版本最权威但只提供最新GA版本老版本比如JDK 8、JDK 11的后续小版本在这里往往找不到。第二个是AdoptiumEclipse基金会旗下的OpenJDK构建项目地址是adoptium.net。这是目前生产环境用得最多的下载渠道它保留了所有LTS版本的完整更新链比如JDK 8的8u392、JDK 11的11.0.21都能在这里找到标准版本下载量非常大稳定性经过实践验证。第三类是一些云厂商提供的OpenJDK镜像源。国内网络环境下从官方网站和Adoptium下载可能需要一点耐心因为服务器在国外。阿里、腾讯、华为的镜像站里也维护了OpenJDK的构建从这些镜像下载速度快很多特别是服务器在国内的场景。但要注意镜像站的文件完整性校验和更新频率参差不齐下载完一定要对比sha256校验值。2.3 压缩包格式和CPU架构怎么选不出错先明确包格式。OpenJDK的官方下载页面通常提供三种格式tar.gz、rpm、deb。手动安装的核心场景推荐用tar.gz也就是绿色版压缩包。它不需要任何包管理系统解压即用下载一次可以在任何同架构的Linux机器上复用。rpm和deb是给包管理器准备的如果你已经决定手动安装那么没必要用这两种格式反而会引入包管理的复杂性。然后是最容易被忽略的CPU架构。同一个版本的OpenJDK针对不同CPU架构有不同构建产物。最常见的是x64对应x86_64架构也就是绝大多数Intel和AMD服务器和aarch64对应ARM架构鲲鹏、飞腾、Apple Silicon虚拟机等。选错架构的直接后果是解压后运行报错常见错误是cannot execute binary file: Exec format error。在Linux命令行里一行命令就能确认当前机器的架构uname -m输出x86_64就选x64包输出aarch64就选aarch64包。这个习惯一定要养成特别是现在国产化替代提速ARM架构服务器越来越多很多老教程默认都是x64的思维照搬容易出问题。2.4 安装前先摸底系统里到底有没有Java这个步骤看着多此一举但建议你还是执行一下。很多Linux发行版会预装一个OpenJDK比如Ubuntu经常自带OpenJDK 11CentOS有时候会自带java-1.8.0-openjdk-headless。如果你不摸底直接解压手动安装的JDK然后配置环境变量很可能出现一个现象你明明设了JAVA_HOME执行java -version却还是老版本因为系统的预装Java占了PATH的优先位置。安装前执行这几条命令自己心里有数which java java -version javac -version echo $JAVA_HOME如果没有输出或者提示command not found说明系统干净可以直接开始安装。如果有输出也不要急着卸载先记下现有的Java路径和版本后面配置环境变量的时候主动避开冲突。特别强调一点如果不是系统必须依赖这个预装Java不太建议贸然删除它。有些系统组件比如Hadoop的某些发行版会对特定的Java路径有硬编码依赖删了之后反而引发别的问题。最安全的做法是保留系统Java把手动安装的JDK通过update-alternatives设为默认或者干脆让JAVA_HOME和PATH指向新装的版本。3. 手动安装完整流程下载、解压、配环境变量、验证一步都不少这一节是全文的实操核心。我会按照一个标准的OpenJDK 17安装流程从头到尾走一遍每一步都会解释为什么要这么做而不是简单地丢命令。为了便于理解我以一台能联网的CentOS 7 x86_64机器为例离线场景会额外补充说明。3.1 下载OpenJDK的两种出路以及怎么保证文件没损坏先从下载说起。如果你的服务器能访问外网直接用wget从官网或Adoptium拉包就行。以OpenJDK官网下载17.0.2为例命令长这样wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz如果服务器不能访问外网就需要在另一台能联网的机器上下载然后用scp、rsync或者内网传输工具把压缩包拷进目标服务器。这类离线场景有一个额外要注意的点下载文件的机器和目标服务器的CPU架构必须一致。很多人在笔记本x86 Mac或Windows上下载了x64包传到ARM架构的服务器上运行时报错才知道白忙一场。无论哪种方式下载完成后强烈建议做一步校验确认文件没有在传输过程中损坏。官网每个下载链接旁边都会给出对应的sha256校验值用下面的命令比较一下sha256sum openjdk-17.0.2_linux-x64_bin.tar.gz把命令输出和官网的值比对如果一致就说明文件完整。这一步在离线场景尤其重要——文件拷贝经过U盘、内网共享、压缩传输多个环节任何一步出错都可能导致解压失败或运行时异常。我排查过好几个Java突然起不来的现场最后发现根因都是安装包损坏这块是最让人头疼的排查方向之一。这里还要提醒一个实操细节下载完成后把压缩包文件重命名成不带中文、不带空格的英文名字。很多人从网上下载文件文件名可能带有一长串扩展参数解压和输入命令时都容易出错。统一命名为openjdk-17.tar.gz这种简洁格式可以让后续操作少踩很多坑。3.2 解压、放到规范目录以及软链这个实用技巧下载好的压缩包一般不会直接解压到目标目录的。我的习惯是先在/usr/local/java这个路径下建一个专门的Java安装目录然后把压缩包解压进去。这个目录结构的好处是多个JDK版本可以在/usr/local/java下并列存放互不干扰管理起来一目了然。mkdir -p /usr/local/java tar -zxvf openjdk-17.0.2_linux-x64_bin.tar.gz -C /usr/local/java/解压完成后/usr/local/java下面会多出一个名为jdk-17.0.2的目录这就是完整的JDK根目录。此时有一个非常推荐的规范操作给当前版本创建一个不带版本号的软链接比如jdk17ln -s /usr/local/java/jdk-17.0.2 /usr/local/java/jdk17这个软链接有什么意义当你后续要升级JDK时只需要解压新版本删掉旧软链重新指向新目录即可JAVA_HOME、PATH这些环境变量完全不用改动。这相当于给JDK版本加了一个指针业务代码只认指针不用关心指针背后到底是17.0.2还是17.0.6。升级JDK的风险因此被压缩到了最小。解压之后建议检查一下目录权限。如果Java应用是以普通用户身份运行的确保这个用户对JDK目录有读和执行权限。大多数情况下JDK目录放在/usr/local/java下默认是root:root普通用户也能读和执行可以正常工作。3.3 配置环境变量的关键细节写错位置等于白配配置环境变量是手动安装OpenJDK环节中翻车率最高的地方。OpenJDK本身不需要安装它就是一堆二进制文件但系统得知道Java命令去哪儿找JAVA_HOME指向哪里这就需要告诉它环境变量。Linux的环境变量配置有很多位置常见的有/etc/profile、/etc/environment、~/.bashrc、~/.bash_profile。它们的作用范围和加载时机完全不同。/etc/profile是对所有用户生效的全局配置推荐手动安装JDK时用这个方案。~/.bashrc只对当前用户生效适合个人测试环境。/etc/environment是系统级的环境变量文件但它在登录早期加载不执行脚本逻辑如果路径引用其他变量会失效一般不太建议用这个文件配置PATH。以全局生效为目标编辑/etc/profile在文件末尾追加以下内容export JAVA_HOME/usr/local/java/jdk17 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar逐行解释一下。JAVA_HOME指向软链jdk17后续切换JDK版本时只要改软链这个变量不用动。PATH$JAVA_HOME/bin:$PATH的意思是把JDK的bin目录放在现有PATH的最前面。注意顺序非常关键放在前面意味着执行java命令时优先找到新装的JDK而不是系统预装的旧版本。如果写成PATH$PATH:$JAVA_HOME/bin一旦系统里其他地方也有java命令会优先命中旧的手动安装就白做了。CLASSPATH这里要特别说明JDK 9之后引入了模块化dt.jar和tools.jar已经不存在了所以如果你装的是JDK 9或更高版本不用设置CLASSPATH设了反而可能引发困扰。上面这行CLASSPATH是给JDK 8准备的请根据你实际安装的版本决定是否需要。配置完以后执行source /etc/profile让配置立即生效。然后检查一下echo $JAVA_HOME echo $PATH如果JAVA_HOME输出正确PATH最前面是/usr/local/java/jdk17/bin说明配置已经生效。有一点容易被坑到source /etc/profile只作用于当前Shell会话。如果你是通过SSH登录的新开一个SSH窗口是可以正常读取/etc/profile的。但如果你用的是非登录Shell比如某些脚本环境、sh执行环境它不会自动加载/etc/profile需要确保启动脚本里自己导入了环境变量。3.4 验证安装java、javac、一个HelloWorld一个都不能少环境变量配好后验证安装是最让人安心的一步。执行三条命令java -version javac -version which javajava -version的输出应该类似这样openjdk version 17.0.2 2022-01-18 OpenJDK Runtime Environment (build 17.0.28-86) OpenJDK 64-Bit Server VM (build 17.0.28-86, mixed mode, sharing)javac -version输出类似javac 17.0.2which java应该指向/usr/local/java/jdk17/bin/java。这里要强调java和javac版本必须匹配。很多人在环境变量上出了岔子java是新版但javac还是老的说明PATH中有另一份JDK的bin目录抢占了位置。最后建议写一个最简单的Java程序验证整个链路的连通性。新建一个HelloWorld.java内容是public class HelloWorld { public static void main(String[] args) { System.out.println(OpenJDK installed successfully!); } }编译运行javac HelloWorld.java java HelloWorld如果看到输出OpenJDK installed successfully!说明从编译到运行的全链条都通了。这一步看似多余却能一次性暴露环境变量配置中那些隐藏的坑。我见过有人java -version正常但实际应用部署时javac找不到类库、报各种编译错误就是因为从没验证过javac这条链路。3.5 一台机器多个JDK版本共存切换方案怎么设计很多生产环境不是只有一种JDK尤其在做微服务迁移的时候老服务跑JDK 8新服务跑JDK 17一台机器上两个版本并存是常态。手动安装天然支持多版本共存切换才是需要设计的问题。最常用的方案是Linux自带的update-alternatives机制。把两个版本都注册进系统然后用统一命令切换update-alternatives --install /usr/bin/java java /usr/local/java/jdk8/bin/java 1 update-alternatives --install /usr/bin/java java /usr/local/java/jdk17/bin/java 2 update-alternatives --config java同样的方式把javac也注册一遍update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk8/bin/javac 1 update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk17/bin/javac 2 update-alternatives --config javacupdate-alternatives的好处是系统级的所有用户切换后立即生效。缺点也很明显它只影响java和javac命令JAVA_HOME其实还是指向固定的路径。如果你有多个版本JAVA_HOME跟随切换才是一个完整闭环。我自己的习惯是在~/.bashrc里写一个简单的shell函数来管理。这个方案更灵活也更直观jdk() { case $1 in 8) export JAVA_HOME/usr/local/java/jdk8 ;; 11) export JAVA_HOME/usr/local/java/jdk11 ;; 17) export JAVA_HOME/usr/local/java/jdk17 ;; *) echo Usage: jdk 8|11|17 return 1 ;; esac export PATH$JAVA_HOME/bin:$PATH java -version }执行source ~/.bashrc后在终端输入jdk 8或jdk 17就能在当前会话里切换JDK版本。注意这只是改了当前Shell的环境变量对系统其他进程和用户没有影响。对于开发机来说这种隔离式切换其实更安全。还有个细节JAVA_HOME这个变量在很多中间件里被硬编码引用比如Tomcat的启动脚本、Maven的mvnw脚本、Gradle的gradlew脚本。切换版本时如果只改PATH不改JAVA_HOME这些工具仍然会用旧版本。所以上面那个shell函数里每次切换一定同时更新JAVA_HOME和PATH两者保持一致才能避免各种明明切了却不生效的诡异现象。4. 装完之后最难缠的几个坑我踩过的和排查过的手动安装OpenJDK本身不难但装完跑起来和装完彻底弄对之间隔着不少坑。这一节我把实操中最常遇到的几个问题整理出来每个问题都附带完整的排查链路和解决方案希望对大家有实际帮助。4.1 环境变量不生效为什么source了却还是旧版本现象设置了JAVA_HOME和PATHsource /etc/profile也执行了但运行java -version显示的却是另一个版本或者echo $JAVA_HOME返回空。这一步先别急着怀疑自己的配置写错了整理一下排查思路。首先执行type -a java它会列出所有能被Shell找到的java命令的位置按优先级排序。如果输出里有一个路径排在/usr/local/java/jdk17/bin/java前面比如/usr/bin/java那问题就出在PATH的优先级上。回看上一节的内容export PATH$JAVA_HOME/bin:$PATH把新JDK放最前面才能覆盖旧的。如果你写反了写成export PATH$PATH:$JAVA_HOME/bin那么系统已有的/usr/bin/java会抢先命中。修改/etc/profile里的这行即可。如果type -a java显示的路径正确但java -version还是老版本那大概率是~/.bashrc或~/.bash_profile里也有alias java...之类的别名定义别名优先级高于PATH。执行alias java可以验证。有的话删掉就行。另外注意登录Shell和非登录Shell的区别。SSH登录时默认加载/etc/profile和~/.bash_profile但执行bash script.sh这类非交互式Shell时它不会读取/etc/profile。如果你遇到手动执行java -version没问题但脚本里就是找不到java的诡异情况去脚本里source一下/etc/profile或者直接把JAVA_HOME和PATH写进脚本开头。4.2 系统自带的OpenJDK和手动安装的OpenJDK打架现象手动安装完JDK 17which java显示的是/usr/bin/javajava -version显示的也是1.8.0版本系统里原来自带的OpenJDK在与手动安装的版本抢位置。这种情况在CentOS、Ubuntu里挺常见因为这两大发行版默认很可能预装Java运行时。我的建议是不要急着一怒之下卸载系统预装的Java而是通过update-alternatives把默认版本切换到现在手动安装的这个。update-alternatives --install /usr/bin/java java /usr/local/java/jdk17/bin/java 100 update-alternatives --config java执行update-alternatives --config java后系统会列出所有已注册的Java版本输入对应数字选择jdk17回车退出后重新验证java -version即可。这里100是优先级数值数字越大优先级越高但如果/usr/bin/java原本是通过软链指向系统Java的update-alternatives会把这一层软链接管过来统一管理。还有一类隐藏冲突系统预装的Java被某个系统服务比如Hadoop的启动脚本、某些监控Agent用绝对路径引用。遇到这种情况不用慌张保留系统Java不动只通过环境变量和update-alternatives切换/usr/bin/java的指向即可。两个JDK完全可以共存互不干扰。4.3 tar包文件名乱码、解压后文件损坏排查链路是什么现象从网上把JDK压缩包下载下来传送到Linux服务器上解压时发现文件名乱码或者解压出来的目录结构不完整运行java时报各种奇怪的错。先说乱码问题。很多人从Windows下好文件再传到Linux文件名可能带着中文编码标识。比如openjdk-17.0.2_linux-x64_bin.tar.gz在Windows浏览器里下载后可能会被附加(1)之类的内容或者用某些国产浏览器下载后文件名自动加后缀。这些问题不止影响心情还可能让你tar解压时找不到文件。解决办法很粗暴下载完成后先mv重命名为简洁的英文名再执行解压。再说文件损坏。解压时遇到gzip: stdin: not in gzip format或者解压完成但运行java时提示No such file or directory这可能是下载不完整、传输出错导致的。最稳的排查方式是回到上一节提到的sha256校验下载完成后立刻比对比对通过再解压不要把校验留到出问题时再补。还有一种情况是解压出来目录存在但bin/java没有执行权限表现就是运行时报Permission denied。用ls -l /usr/local/java/jdk17/bin/java看一眼权限如果是-rw-r--r--执行chmod x修正权限即可。这类问题常出现在某些压缩工具或U盘文件系统传输过程中丢失了Unix文件权限信息拷进Linux后需要重新设置。4.4 依赖缺失运行Java时报libfontconfig.so.1这类错误的处理现象JDK 17解压好、环境变量配好执行java -version却报错java: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file这个错误很常见尤其是最小化安装的系统上。原因是JDK的某些基础库尤其是用于AWT图形相关的功能在编译时动态链接了fontconfig库而最小化安装的系统没有装这个图形库。虽然你只是跑一个命令行Java程序但JDK的所有二进制在启动时统一加载缺少这个库就会直接拦住。排查方法用ldd查看JDK的二进制依赖了哪些共享库ldd /usr/local/java/jdk17/bin/java | grep not found看到所有的not found依赖后根据发行版补齐即可。CentOS系执行yum install -y fontconfigDebian/Ubuntu系执行apt install -y libfontconfig1装完后再执行java -version问题就消失了。类似这种还可能出现libXrender.so.1、libXi.so.6等图形库缺失解决方案类似用ldd定位按名补齐。这类问题给我们的启示是手动安装JDK不意味着解压完就万事大吉系统的基础库依赖还是要确认一下的。尤其是最小化安装的服务器缺的库可能比你想象的要多。所以在正式部署前先把ldd检查当成一个标准步骤能省掉很多临场排障的时间。4.5 最容易踩但最难察觉的坑架构和位数不匹配现象JDK解压成功、环境变量配置正确、依赖库也装了但执行java时直接报Exec format error或者干脆bash: ./java: cannot execute binary file。这是最典型的架构不匹配问题。你下载的OpenJDK是x64包但目标服务器是aarch64架构。这种情况在ARM服务器普及之后越来越常见特别是很多从x86环境迁移应用的人在下载时下意识地拿了原来的包传到新服务器上就启动不了。排查方法其实很简单前面已经提过执行uname -m确认架构然后下载对应的包。但这里想多说几句在拿到一台陌生服务器时第一件事就是确认架构和操作系统发行版而不是直接进入安装环节。这跟拿到一个新项目先读README是一个道理。我很推荐大家在安装脚本的最前面加上一段架构检查逻辑arch$(uname -m) if [ $arch x86_64 ]; then echo 架构: x86_64, 请选择x64包 elif [ $arch aarch64 ]; then echo 架构: aarch64, 请选择aarch64包 else echo 未知架构, 请确认服务器的CPU类型 exit 1 fi不要觉得这一步多余。我亲眼见过有人在鲲鹏ARM服务器上反复安装JDK 17失败整整折腾了半个下午最后发现是下载的x64包。如果一开始就做架构检查这半小时完全可以省下来。除了架构还要注意一个相对少见但确实存在的坑32位系统的i686架构包。现在绝大多数Linux服务器都是64位但某些嵌入式设备、老旧的虚拟机模板还可能是32位。下载时看清楚包名里的x8632位和x6464位区别不要想当然。手动安装OpenJDK这个操作说复杂不复杂说简单也不简单。关键在于理解每一步背后的原理而不是机械地复制命令。结合我自己这几年的使用经验有两点心得值得在最后提一下。第一个是保留好每次下载的tar.gz压缩包放在一个专门的软件仓库目录里。这样下次在新机器上安装时直接用本地的包省去重新下载的时间也能保证版本和线上环境完全一致。第二个是精心设计你的JDK切换机制无论是用update-alternatives还是shell函数务必保证JAVA_HOME和PATH的联动切换这样多版本共存时才会真正省心。手动安装的路径一旦跑通后续换版本、加机器、做交付都会变得很清爽。毕竟在一个可控的环境里越少依赖隐形的自动化就越容易在出问题时快速定位到根因。这算是我在Linux运维这条路上体会到的最有价值的一课。
返回列表