news 2026/9/29 2:00:10

Linux下JDK卸载安装与环境变量配置指南:多版本切换与故障排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux下JDK卸载安装与环境变量配置指南:多版本切换与故障排查

作为在Linux上折腾过无数回JDK的人,我太清楚这个场景了:新项目要求必须把JDK从8升到17,结果卸载完旧版本才发现java -version还在倔强地输出老版本号;或者装好了新JDK,一执行source /etc/profile,整台机器命令直接瘫痪;又或者明明按教程配了JAVA_HOME,但重启之后一切恢复原样。如果你也在这个问题上反复碰壁,这篇文章就是给你写的。我把CentOS系和Ubuntu系两种主流发行版上,从摸底排查、分类卸载、选型下载到环境变量配置、多版本切换、常见故障排查的完整链路都过一遍,里面的步骤和坑都是我实际踩过、验证过的,照着操作就能少走一大段弯路。

1. 为什么"卸载JDK"在Linux上老是卸不干净

先回答一个很多人没想明白的问题:为什么在Linux上卸载JDK这么容易留尾巴?根本原因在于,JDK在Linux里的存在方式是"分散"的。和Windows下"一个安装目录加上注册表"的集中模式完全不同,Linux上的JDK通常同时以三种形式扎根在系统里:二进制文件、环境变量脚本、软链接与alternatives机制。你在网上能找到的教程通常只教其中一种姿势,而实战里这三样往往叠在同一个系统里,只处理其中一两处,就等于没卸干净。

1.1 三种安装方式留下的三种痕迹

按我在生产环境里见过的实际情况,JDK的安装方式基本可以归为三类,各自留下的清理负担完全不同。

安装方式文件分布位置卸载时主要打扫战场
rpm/yum/apt 包管理器安装/usr/lib/jvm、/usr/bin、/usr/share等标准目录,由包数据库跟踪卸载包本体、清理依赖、处理alternatives记录
tar.gz手动解压安装通常在/usr/local/java或/opt下的自定义目录删除整个目录、清理软链接、清理环境变量
从容器镜像或已编译发行版中直接拷贝目录集中在自定义位置,但常被多个应用直接引用删除目录前必须确认没有进程和服务脚本还在引用它

我遇到最多的情况,是同一台机器上同时存在"包管理器装的OpenJDK 8"和一个"手动解压的JDK 11"。两条链路叠加之后,java命令被alternatives软链接指向其中一个,而JAVA_HOME却指向另一个。这种情况下你单独卸掉其中一个,系统表现会非常分裂——有的应用能用,有的应用立刻报错。

1.2 "假卸载"背后的环境变量与软链接残留

所谓"假卸载",就是指你执行了rpm -e或者apt remove,JDK本体确实删了,但/etc/profile、~/.bashrc里还留着export JAVA_HOME=/usr/lib/jvm/java-1.8.0...这样的行,PATH里也还残留着旧JDK bin目录的路径。更隐蔽的是软链接残留:/usr/bin/java这个文件本身往往不是一个真实二进制,而是指向/etc/alternatives/java的软链接,后者再指向真实的JDK目录。卸载JDK后,第一个软链接可能还在,只是最终目标变成了"不存在的文件"。

结果就是:你敲java -version,要么返回一个莫名其妙的错误,要么因为PATH兜底机制找到了另一个版本,输出了一个"阴魂不散"的旧版本号。这也是为什么很多人在卸载后固执地认为"这系统没救了"。其实系统没病,只是残留没清干净。

2. 动手卸载前,先摸清这台机器上到底有几个JDK

卸东西之前得先知道有什么。这个步骤看似多余,却是整个流程里最能省时间的一环。我见过不少人一上来就rm -rf一个目录,结果都不知道系统里还装着另一个JDK,最后定位问题花了几个小时。

2.1 用三条命令锁定当前生效的JDK

先在当前终端里确认"正在用的JDK"到底是哪个,全套命令如下:

java -version which java ls -l $(which java) readlink -f $(which java)

我拿一台CentOS 7上的典型输出举例:

$ java -version openjdk version "1.8.0_362" OpenJDK Runtime Environment (build 1.8.0_362-8.b08.el7_9.x86_64) OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode) $ which java /usr/bin/java $ ls -l /usr/bin/java lrwxrwxrwx. 1 root root 22 1月 7 10:00 /usr/bin/java -> /etc/alternatives/java $ readlink -f /usr/bin/java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362-8.b08.el7_9.x86_64/bin/java

第一行告诉你当前实际生效的版本,最后一行告诉你这个版本真正的家在哪。这两条信息是后续所有判断的基准。

2.2 扫描所有副本:包列表加目录盲查

接下来要把机器上所有JDK副本都找出来,尤其是那些"潜伏"的手动安装包。按发行版分别执行:

RHEL/CentOS/Fedora系:

rpm -qa | grep -iE "jdk|java-"

Debian/Ubuntu系:

dpkg -l | grep -iE "jdk|openjdk"

然后再做一次目录层面的盲扫,防止有解压包没被包管理器记录过:

find /usr /opt /home -name "java" -type f 2>/dev/null find /usr/local /opt -maxdepth 3 -type d -iname "*jdk*" 2>/dev/null

第一局命令是全盘范围的,谨慎使用。第二局命令限定在常见安装目录和深度,速度快、噪音少。把所有结果汇总后,你会得到一张"JDK分布全景图":哪些由包管理器管、哪些是手动解压、哪些只是软链接的中间状态。这张图就是下一步卸载的依据。

2.3 卸载前评估依赖和备份

动手之前花两分钟确认两件事,能避免一次事故级操作。第一,确认没有正在运行的Java进程依赖当前JDK:

ps -ef | grep java | grep -v grep

如果看到Tomcat、Spring Boot、Elasticsearch等进程还在跑,先停下来,确认服务归属后再决定是否卸载。

第二,给当前JDK做个快速备份。对虚拟机可以直接做快照,没有快照就压缩一下目录:

tar czf /tmp/jdk_backup_$(date +%F).tar.gz /usr/lib/jvm

这步不丢人。我干运维这些年,一次快照救回整个环境的情况遇到过太多次了。别觉得自己操作熟练就不需要备份,JDK这种被全链路依赖的基础组件,回滚能力比"一次成功"重要得多。

3. 按安装方式拆解卸载步骤:rpm、deb、tar.gz各有各的归宿

现在进入正题。卸载动作本身不难,难的是针对不同安装方式做对应的完整清理。我按三种主流安装方式分别给出操作路径,最后再补一个统一的环境变量清扫方案。

3.1 RPM系:rpm -e 与 yum remove 的取舍

在CentOS/RHEL/Rocky/AlmaLinux这类系统上,先用前面的命令确认包名列表,然后执行卸载:

rpm -qa | grep -i jdk # 卸载指定包,注意包名要写全 rpm -e java-1.8.0-openjdk-1.8.0.362-8.b08.el7_9.x86_64

但这里我强烈建议优先用yum remove或dnf remove而不是裸rpm -e,理由很实际:yum会自动处理依赖关系。裸rpm -e卸载后,那些当初被自动装进来的依赖包会变成孤儿,长时间堆积在系统里。当然,yum remove也可能顺带把依赖它的其他软件一起删掉,所以执行前仔细阅读它列出的"将移除的包"清单,看到有非JDK相关的东西就停下来确认。

卸载完成后执行一下:

yum autoremove # 或 dnf autoremove

清理被自动安装且不再被任何包需要的孤儿依赖。这个命令有时会误伤,所以同样要先看输出清单。

3.2 Debian系:apt purge 清理得更彻底

Ubuntu/Debian系的包管理逻辑略有不同,先查看已安装的Java/JDK相关包:

apt list --installed | grep -iE "jdk|openjdk"

然后推荐用带--purge参数的卸载方式:

apt remove --purge openjdk-11-jdk openjdk-11-jre-headless

remove只删二进制和库文件,purge会把配置文件也一并清掉。在Debian系上,软件卸载后留下的配置文件往往是各种诡异报错的来源,所以我默认都用purge。装过JDK的包数量可能不止两三个,比如openjdk-17-jdk-headless、openjdk-17-jre之间还有依赖关系,显示在列表里的都处理掉。操作完同样执行apt autoremove清理孤儿依赖。

3.3 tar.gz 解压安装:删目录只是第一步

手动解压包卸载的难点不在删目录,而在软链接和环境变量的二次清理。删目录本身很简单:

rm -rf /usr/local/java/jdk1.8.0_362

但删完之后必须检查以下三个地方,缺一个都算没卸干净。

第一,手工建立的软链接。当时在/usr/bin或/usr/local/bin下用ln -s建过java、javac、jar的话,要逐个删除:

rm -f /usr/bin/java /usr/bin/javac /usr/bin/jar

如果当初是通过update-alternatives注册的,用update-alternatives --remove来移除:

update-alternatives --remove java /usr/local/java/jdk1.8.0_362/bin/java update-alternatives --display java

第二,查看update-alternatives的当前状态,确认没有悬空记录:

update-alternatives --display java

第三,搜索并清理所有指向该目录的环境变量引用。用这一条命令把可能的藏身之处一网打尽:

grep -rn "jdk1.8.0_362\|JAVA_HOME\|CLASSPATH" /etc/profile /etc/profile.d/ ~/.bashrc ~/.bash_profile ~/.profile /etc/environment 2>/dev/null

搜出来的内容逐条查看,该注释的注释,该删的删。

3.4 环境变量与alternatives残留的统一清扫

不管哪种安装方式,最后都要做一遍环境变量和alternatives的"大扫除"。这里我强调一个操作顺序:先清理包和目录,再清软链接和alternatives,最后清环境变量,反过来会非常难受。原因很简单——如果把环境变量先删了,你想确认"当前shell用的到底是哪个java"都没了线索,排查问题会失去抓手;而先清包和目录,环境变量里的路径就会明确地"无效化",你一眼就能看出哪些行该删。

清理的核心命令就一条:

grep -n "JAVA_HOME" /etc/profile /etc/profile.d/*.sh ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/null

再检查一下/etc/alternatives有没有指向无效目标的悬空链接:

ls -l /etc/alternatives/java 2>/dev/null update-alternatives --display java 2>/dev/null

做完这一步,这台机器上的旧JDK才算真正"寿终正寝"。

4. 装新JDK前必须确定的版本、厂商和下载渠道

卸载完只是前半场,装新JDK同样有一堆决策要做。很多人直接跳进"下载"环节,结果在版本选择、厂商授权、下载速度这几个点上翻车。

4.1 LTS版本怎么选:从JDK 8到JDK 21

版本选型这件事,环境不同结论也不同。我按2025年这个时间点的实际生态情况给出一张对照表:

版本生态地位典型场景我的建议
JDK 8 (LTS)老牌主力,Hadoop、Spark等大数据生态兼容性最好存量老项目、绑定大数据组件版本的环境能迁移就迁移,官方维护已进入后期
JDK 11 (LTS)大量中间件的最低版本门槛,ZGC和HTTP Client转正框架版本锁定了11的企业项目处于过渡期,新项目不推荐
JDK 17 (LTS)Spring Boot 3、主流云原生框架的默认要求新项目首选之一2025年最稳妥的选择
JDK 21 (LTS)虚拟线程正式版、分代ZGC、Record模式等新特性追求新特性、高并发场景正在加速普及,新项目可以放心上

关于LTS这顶帽子我要多说一句:Java的版本节奏是每半年一个功能版本,LTS才是真正"长期受支持"的版本。像JDK 12、JDK 16这种非LTS版本,发布几个月后官方就不再提供免费更新。生产环境选型时别只看新特性,优先认准LTS。顺便回应一下热搜里的"jdk降级到17"这种需求——降级的原因通常是某个框架、某个中间件刚升级后不兼容高版本JDK,或者高版本JVM参数在低版本下不被识别。降级本身做法和老版本安装没什么区别,重点是装完后要把根因搞清楚:版本降下来了,问题是否真的解决了,别让版本成了背锅侠。

4.2 官网、国内镜像和系统源怎么选

确定版本之后,下载渠道的选择直接决定你安装环节顺不顺利。

  • 发行版自带源:yum install java-17-openjdk或apt install openjdk-17-jdk。最省事,和系统包管理深度集成,装完自动注册alternatives,维护成本最低。缺点是你拿到的不是Oracle官方JDK,而是OpenJDK的发行版编译产物。
  • 清华/阿里云/华为云镜像站:国内访问速度快,提供OpenJDK、Adoptium等产物的镜像。适合需要手动解压安装、对JDK构建来源有要求的场景。
  • Oracle官网:官方JDK功能最全,但下载需要注册登录,且新版Oracle JDK的许可协议(NO-FEE、OTN)在商用场景下有明确限制,务必读清楚再用。
  • SDKMAN:适合开发机和CI环境,一条命令就能装、切换任意版本,但对服务器上线这种一次性部署场景反而多了一层概念负担。

我个人的倾向是:生产环境的物理机或云服务器,优先用发行版自带OpenJDK,维护最省心;测试环境或容器环境,用SDKMAN或内网镜像手动解压;不要在服务器上硬趴Oracle官网,很多人卡在登录验证这一步,白白消耗半天时间。

5. 环境变量配置的"少踩坑"方案:文件选择、写法与验证

环境变量配置是整个JDK安装过程里翻车率最高的环节。原因很简单,网上教程各说各话,有写/etc/profile的、有写~/.bashrc的、有写/etc/environment的,看着都能用,实际上作用域、加载时机都有差异。把差异搞清楚,就不会再犯"配置了不生效"或者"一改就崩全局"这种错误。

5.1 把环境变量写进 /etc/profile.d 而不是 /etc/profile

先说结论:我最推荐的方式,是在/etc/profile.d/下新建一个独立脚本,比如java.sh。

/etc/profile在bash登录时被读取,是"公共区域"。很多程序的安装脚本会往这个文件末尾追加内容,时间一长,这个文件会被各种用途的配置塞满,维护性和可阅读性都很差。一旦改错一个字符,影响的是所有用户的所有登录会话。

而/etc/profile.d/目录是/etc/profile启动时自动遍历加载的一个扩展目录,所有.sh文件都会被依次执行。把JDK配置放到一个独立文件里,好处是职责单一、排查方便、卸载时直接rm掉这个文件就清理干净了,不需要在大型配置文件里小心翼翼地找行删行。这是Linux下管理环境变量的最佳实践,不只是JDK,任何软件建议都按这个思路来。

5.2 JAVA_HOME和PATH的标准写法及三个常见误区

以JDK 17解压到/usr/local/java/jdk-17为例,标准的配置写法是:

cat > /etc/profile.d/java.sh <<'EOF' export JAVA_HOME=/usr/local/java/jdk-17 export PATH=$JAVA_HOME/bin:$PATH EOF

两个关键点,一个是顺序,一个是别配CLASSPATH。

PATH的顺序直接影响命令解析优先级。export PATH=$JAVA_HOME/bin:$PATH是把新JDK路径放在前面,这样在交互shell里执行java时会优先命中新版本。如果你写成export PATH=$PATH:$JAVA_HOME/bin,而系统/usr/bin下恰好存在旧版本,那么旧版本会一直"压制"新版本,java -version怎么验证都是旧的。我见过很多人明明装好了新JDK,最后发现是这个顺序问题导致的,排查了很久。

第二点是JDK 9(模块化)之后,不要再配置CLASSPATH。很多老教程会让你写这样一行:

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

但JDK 9以后dt.jar、tools.jar这两个文件已经不存在了。配了这行,编译时类路径里多了一个"幽灵jar",反而导致各种找不到类的诡异报错。现代开发用Maven、Gradle或IDE管理类路径,根本不需要手动配CLASSPATH。这个观念害人不浅,我身边真实案例:某同事的编译报错排查了一整天,最后就是这行残留配置惹的祸。

第三个隐藏坑是export语句的等号两侧不能有空格。export JAVA_HOME = /path在bash里会被解析成执行export命令并传入三个参数,报错信息模棱两可,新手很难一眼看穿。

5.3 配置完成后的一条龙验证

写完配置后,让配置在当前会话立即生效:

source /etc/profile.d/java.sh

也推荐直接新开一个终端窗口,让shell自己加载,这样能验证"重启后配置是否持久化"。然后执行:

java -version javac -version echo $JAVA_HOME which java echo $PATH

一条条检查:java -version输出版本号是否符合预期,javac -version是否和java版本一致,JAVA_HOME是否非空且指向正确,which java路径是否指向新JDK的bin目录。这几个输出全部正常才算配置成功。

如果发现重启后变量丢失,基本可以确定是写进了非持久化的位置,比如直接在交互shell里export的,没有落盘。如果发现java对了但javac不对,多半是alternatives里只注册了java没有注册javac。

6. 多版本JDK共存时的两种切换思路

生产环境和开发机上,"多版本共存"几乎是刚需。手头三四个项目各自要求不同的JDK版本,总不能每次换项目都改环境变量重开终端。这里介绍两个我用下来最顺手的思路。

6.1 update-alternatives 管理全局软链接

update-alternatives是Debian系和RHEL系都提供的软链接管理工具。它的原理是这样:/usr/bin/java是一个软链接,指向/etc/alternatives/java,而后者再被update-alternatives管理,指向真正的JDK二进制。切换版本时,只需要改/etc/alternatives/java的指向,无需改动PATH。

注册两个版本到alternatives:

update-alternatives --install /usr/bin/java java /usr/local/java/jdk-17/bin/java 1700 update-alternatives --install /usr/bin/java java /usr/local/java/jdk-1.8.0_362/bin/java 1800

最后的数字是优先级,数值大的默认生效。切换版本时执行:

update-alternatives --config java

会弹出交互菜单让你输入编号选择版本。注意,这只管理你注册过的命令,如果注册时只注册了java,那javac、jar、keytool这些命令不会跟着切。要完整管理,就得把这些命令也依次注册一遍。所以这个方案适合"命令级"切换,比较直观。

6.2 JAVA_HOME指向current软链接的做法

另一个我更喜欢、在服务器上用得更多的方案,是建立一个"当前版本"的软链接,名字就叫current。

先把所有JDK版本整整齐齐放在/usr/local/java/目录下:

ls /usr/local/java/ jdk-1.8.0_362/ jdk-17/

建立current链接指向当前默认版本:

ln -s /usr/local/java/jdk-17 /usr/local/java/current

然后在环境变量脚本里永远只写这个current路径:

cat /etc/profile.d/java.sh <<'EOF' export JAVA_HOME=/usr/local/java/current export PATH=$JAVA_HOME/bin:$PATH EOF

以后要切版本,只需要执行:

rm -f /usr/local/java/current ln -s /usr/local/java/jdk-1.8.0_362 /usr/local/java/current

这个方案的好处非常明显:环境变量脚本、Systemd服务单元、应用启动脚本里永远只有current这一个路径,切换版本就是改一个软链接,一秒完成,且不会出现"改了脚本但其他脚本没跟着改"的遗漏问题。升级JDK也一样,解压新版本到目录,改一下current即可,对应用无感。配合第5节讲的做法,这套方案是我这些年用得最舒服的。

如果你还需要Maven、Gradle等工具跟随JDK切换,只要它们读取的是JAVA_HOME变量,就都会自动跟着current走,这是这个方案最大的可扩展性价值。

7. 卸载与安装过程中高频出现的四个故障排查链路

最后这一大章,我把这些年遇到的高频坑和完整排查思路整理出来。每个问题都不是直接给答案,而是给出一步步定位的链路,希望你下次遇到时不只"会修",还能"会查"。

7.1 旧JDK卸载后 java -version 仍输出旧版本

这是卸载场景中排名第一的灵异事件。明明执行了卸载命令,JDK目录也删了,为什么java -version还有输出?

完整排查链路:

# 第一步:看java命令到底在哪 which java # 第二步:看它是不是软链接,指向哪里 ls -l $(which java) # 第三步:看软链接最终指向什么,目标文件是否存在 readlink -f $(which java) # 第四步:确认是否还有残留的JDK包 rpm -qa | grep -iE "jdk|java-" # CentOS系 dpkg -l | grep -iE "jdk|openjdk" # Ubuntu系 # 第五步:查环境变量里是否还有旧JDK路径 echo $PATH grep -n "JAVA_HOME\|jdk" /etc/profile /etc/profile.d/*.sh ~/.bashrc 2>/dev/null

我见过最典型的情况是:系统里原本有OpenJDK 8和手动解压的JDK 8两套,卸载包管理器版本后,/usr/bin/java的软链接虽然被调整了,但PATH里手动解压版本的bin目录还排在前面,于是java命令从PATH中找到了那个残留目录里的二进制,继续输出旧版本号。按上面五步走完,定位到具体来源,再按第3章的清理路径处理即可。

这里补充一个容易忽略的细节,修改环境变量后,当前shell的PATH缓存可能还是旧值,因为bash会缓存命令路径。执行一下hash -r清除命令哈希表,能避免"明明改了配置、但当前终端里怎么测都是旧命令"的假象。

7.2 改坏profile导致大量命令找不到的救援流程

这个故障足够吓人,但也是最好处理的。典型原因是有人把export PATH=$JAVA_HOME/bin:$PATH写成了export PATH=$JAVA_HOME/bin,少了$PATH。source之后当前会话的PATH被整个覆盖,ls、vi、grep、cat全部消失,看起来系统"废了"。

救援流程,冷静执行:

# 第一步:用绝对路径打开文件修复 # 因为ls等命令已经不在PATH里了,必须用绝对路径调起来 /usr/bin/vi /etc/profile.d/java.sh # 或者直接用sed批量替换修复 /bin/sed -i 's#export PATH=/usr/local/java/jdk-17/bin#export PATH=$JAVA_HOME/bin:$PATH#' /etc/profile.d/java.sh # 第二步:修复后,用绝对路径启动一个子shell /bin/bash # 第三步:检查PATH是否恢复正常 echo $PATH

如果是通过systemd服务的shell环境被改坏,不用慌,直接重开一个新SSH连接或者用系统控制台登录,新会话会重新读取配置。这个坑的根本教训是:修改任何profile文件之前先备份;尽量使用/etc/profile.d/下的独立小文件;不要在profile脚本里写复杂循环和条件判断这种高风险逻辑。

7.3 压缩包乱码、校验失败与glibc依赖缺失

"linux 解压文件乱码"这个话题常年是搜索热榜常客,在JDK下载场景里也经常出现。

如果你下载的是.tar.gz格式,解压后出现乱码文件的概率极小,因为tar格式本身处理文件名编码的机制比较规范。真遇到乱码,多半是压缩包下载不完整或者被中断。这时候别想太多,先校验文件完整性:

echo "<官方发布的SHA256值> <下载的文件名>" | sha256sum -c -

校验不通过直接重新下载,别在一个坏压缩包上浪费时间。

如果你下载的是.zip格式,在中文locale环境下解压文件名乱码是常态,根因是zip格式里记录了文件名的编码方式,而Windows下生成的zip通常是GBK/CP936。处理方式是指定解码:

unzip -O GBK jdk-17_linux-x64_bin.zip -d /usr/local/java/

但更省事的办法,是直接选择.tar.gz格式,从源头上避开这个编码问题。

另一个隐藏坑是JDK 17以上版本在某些精简版或国产化系统上运行报错,提示找不到某个共享库。这时用ldd查看动态依赖是否完整:

ldd /usr/local/java/jdk-17/bin/java

缺什么库就通过包管理器补什么。这不是JDK坏了,是基础运行库不完整。

7.4 服务脚本报"找不到jdk"的定位方法

"找不到jdk"这个现象经常发生在普通用户或服务环境里,典型表现是脚本里echo $JAVA_HOME输出为空。排查链路分几步:

第一步,确认该用户环境下是否加载了profile.d脚本。通过在shell里执行bash -l重新以登录shell方式启动,再看echo $JAVA_HOME是否有输出。

第二步,确认脚本是否有执行权限。虽然放在/etc/profile.d/下通常不要求+x权限,但如果配置文件被手动移动过,权限位可能不对,顺手看下:

ls -l /etc/profile.d/java.sh

第三步,重点排查Systemd服务场景。Systemd服务默认不会加载/etc/profile和/etc/profile.d/里的环境变量,这是很多人部署Spring Boot时百思不得其解的问题——明明终端里echo $JAVA_HOME正常,服务启动却找不到JDK。解决办法是在Service单元文件的[Service]段显式声明:

[Service] Environment="JAVA_HOME=/usr/local/java/current" Environment="PATH=/usr/local/java/current/bin:/usr/bin:/bin"

或者把环境变量写进启动脚本里source一下。这是"终端正常、服务异常"类问题最典型的成因。


关于JDK的卸载与安装,我能分享的实战经验差不多就是这些。最后说一个我个人的习惯:不管在哪台机器上,JDK安装这件事我都会按照"解压到统一目录、profile.d里只写一行JAVA_HOME、current软链接管理版本"这套固定流程来做。它看起来朴素,但把"改环境变量导致全线服务起不来"这种凌晨事故的触发机会降到了零。希望这篇整理也能让你的Linux环境里少一些JDK带来的折腾。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 1:59:45

FOC电机控制实战解析:坐标变换、SVPWM与无感观测器落地要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:58:54

Synopsys AXI VIP Port Monitor接入Scoreboard:TLM连接与实战要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:58:31

群晖无法正确安装此套件?签名、套件源与SSH日志排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:58:23

Agent智能体开发实战指南:从ReAct原理到LangGraph框架选型

简介&#xff1a;《2025智能体Agent实用指南》系统讲解了构建智能体的最佳实践&#xff0c;适合具备一定编程基础、对AI与自动化感兴趣的产品经理、工程师和技术团队成员。文档从智能体的基本概念出发&#xff0c;阐释其与传统软件的区别&#xff0c;并针对复杂决策、规则维护困…

作者头像 李华
网站建设 2026/9/29 1:57:58

Log4j.xml与log4j2.xml配置实战:加载、滚动、继承与排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:56:53

MoE论文合集整理指南:算法、系统与应用三条主线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华