JDK 1.6.0_20环境变量配置与多版本共存实战指南 简介JDK 1.6.0_20 是 Java 6 系列中被广泛使用的开发工具包版本适合需要维护老系统、学习 J2SE 底层机制或进行离线 Java 环境搭建的开发者。压缩包内不仅包含 javac、java、jar 等标准命令还提供完整的 JRE 运行环境和 src.zip 源码便于跟踪 JDK 内部实现。该 RAR 压缩包共 1245 个文件总大小约 42.73MB。其中 jar 归档包构成核心类库xml 与 properties 承担配置管理exe 和 dll 用于 Windows 平台运行另附字体、时区数据、C 头文件等资源解压并配置 JAVA_HOME 后即可直接使用。版本特色包括 JDBC 4.0、NIO 2.0 异步 I/O、增强的动态代理和 Swing 组件同时优化了 JVM 内存管理与 JIT 编译性能。目前已有 1287 人学习下载。对于面临老项目兼容问题或想深入研究 Java 早期实现细节的开发者这是一份便于离线备查的宝贵资源能够帮助理解现代 Java 特性的演进基础。 JDK 1.6.0_20这个版本号现在拿出来说很多人第一反应是“这玩意儿还活着”不奇怪我自己刚接触它的时候也觉得是古董但后来在几个传统行业的项目里连续碰到它才意识到老版本的生命力远比想象中顽强。这个包是Java 6时期的Update 20大概2010年前后面世放到今天来看技术栈确实是旧了点但一些银行、制造、政务信息系统的生产环境里它还在老老实实地跑着每天几百万次的调度任务。如果你正在维护这类旧系统刚接手的项目里有个老掉牙的JDK或者单纯搞不懂“为什么环境变量配了半天java都没反应”这篇文章会把我在这个版本上踩过的坑、理清楚的原理和实际可用的操作全部摊开讲不走虚的。1. 聊聊jdk1.6.0_20这个老家伙1.1 版本号里藏着的年代感JDK 1.6.0_20拆开看就是Java SE 6的第20个更新版。那个年代Java的版本号还是“1.x”的写法后来到JDK 8开始才彻底习惯叫“Java 8”。如果你看到某个安装包的名字是jdk-6u20-windows-x64.exe那就是它没错。有个容易被忽视的细节_20这种update版本并不是单纯修复bug。在1.6.0_18之前Java 6的JIT编译器和HotSpot GC在部分高并发场景下表现不稳定很多跑WebLogic 10.3的老系统会把JDK版本钉死在某个update上_18、_20是当时技术社区里讨论度很高的两个版本。换句话说你遇到的不是随手挑的一个更新包而是当年一批项目在上线周期里反复测试后锁定的“安全版本”。为什么到今天还会见到它我的经验是三个原因一是老应用用了太多第三方库一旦换JDK就报各种莫名其妙的异常二是运维手册、部署脚本全按老版本写好没人愿意背改造的锅三是部分旧硬件的驱动和监控组件只适配了老JVM。于是版本就这么被“冻结”了。1.2 Java 6时代的功能回忆Java 6本身有不少今天看起来很基础、当年却很能打的能力JSR 223脚本引擎支持在Java程序里跑JavaScriptJDBC 4.0让数据库驱动注册这件事变得自动化不用再手动Class.forName还有可插拔注解处理和多编译器API。用现在的眼光看这些功能都算不上惊艳但放在当年正是这些能力让Java在企业开发里越来越顺手。说到1.6.0_20这个具体版本它还有一个在运维层面值得注意的点它对内存管理和类加载的默认参数比早期1.6更激进部分老应用升级到_20后出现过PermGen空间变化的情况。所以当年不少人守着_18不升_20也有守着_20不往上升的。这些历史背景对排查问题很有帮助因为你拿到的生产环境很可能就是某一批人当年反复权衡后定下来的配置组合。2. 安装与首次配置重新捡起jdk1.6.0_202.1 从存量环境里翻出来的安装包先说实话现在想从官方渠道下载1.6.0_20越来越费劲老版本下载入口藏得非常深而且现在很多新版系统打开这些旧安装包还会报“不兼容”。所以你在真实项目里看到这个版本通常是从公司资料库、服务器备份目录或者某位老同事的U盘里翻出来的。这里我不太建议在公共搜索里乱找来历不明的压缩包下载捆绑垃圾和篡改风险都不小宁可找内部存档。Windows环境安装它有个老规矩安装路径不要带空格和中文。D:\jdk1.6.0_20这种就很好不要装到C:\Program Files\Java\jdk1.6.0_20。原因很直接那时候不少开源工具和自研脚本不会对路径加引号路径一有空格各种“找不到命令”“class not found”就来了。与其后面和脚本较劲不如一开始就把路径选清爽。Linux环境则一般把tar.gz解压到/usr/local/jdk1.6.0_20再做一个软链指向/opt/jdk或/usr/local/java。软链的作用是以后升级版本不用改一堆脚本只要把软链指到新目录。2.2 环境变量到底在配什么配不好为什么报错网上搜索“jdk环境变量配置失败”能搜出一堆帖子很多人照着配完java -version还是提示“不是内部或外部命令”。要搞明白这个问题得先知道三个变量各自是干什么的JAVA_HOME给IDE、Maven、Tomcat这些工具指明JDK装在哪。PATH让命令行系统能在任何目录下找到java.exe、javac.exe。CLASSPATH告诉JVM去哪找类库和第三方jar包。但这里有个很多人不知道的真相现代Java程序基本不看系统CLASSPATH它们要么自带启动脚本精确设置要么通过jar/war包的内部结构加载。你手动配置的系统CLASSPATH只对直接用javac/java命令运行class文件的场景有意义配置不当反而会把系统环境搞乱。Windows下的配置可以用图形界面也可以用命令。如果用命令注意setx的执行细节setx JAVA_HOME D:\jdk1.6.0_20 /M setx PATH %JAVA_HOME%\bin;%PATH% /M setx CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar /M/M参数是写入系统级环境变量必须用管理员身份运行CMD。但setx有个大坑它对PATH变量长度有限制而且在旧版Windows上会把原有PATH截断。我见过有人配完JDK后系统里其他软件全打不开就是因为setx把PATH冲掉了。所以更稳妥的做法是先在图形界面里把JAVA_HOME和CLASSPATH配好PATH那一项用“编辑文本”的方式手动把%JAVA_HOME%\bin追加到最前面不要用setx去覆盖。Linux下则一般写到/etc/profile或用户目录的.bashrc里export JAVA_HOME/usr/local/jdk1.6.0_20 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar配置完记得source /etc/profile或者重新登录。验证的时候别只看java -version还要看javac -version因为有些安装包bin目录下只有java没有javac这种“残缺版”在编译项目时会直接暴露问题。3. 新旧共存的JDK管理方案3.1 一台机器上装了七八个JDK很正常现在做开发的人电脑里装着JDK 8、11、17甚至21都不奇怪再叠加上这个老掉牙的1.6.0_20环境变量怎么管就成了大问题。搜索里很多人问“jdk 1.8怎么降级到17”或者“idea修改jdk版本”本质都是同一个场景系统里同时存在多个JDK程序偏偏选中了错误的那一个。容易出现问题的不是JAVA_HOME没配对而是PATH里同时保留了多个版本的bin路径。Windows找java.exe是按照PATH顺序从前到后找的先找到哪个就用哪个。所以你会发现JAVA_HOME指向的是1.6.0_20但命令行里java -version出来的却是1.8因为PATH里1.8的路径排在更前面。我现在的做法是为每个版本建一个明确命名的目录比如D:\jdk\jdk1.6.0_20、D:\jdk\jdk1.8.0_201然后用一个切换脚本去改JAVA_HOME和PATH而不是每次手改系统配置。类似这样echo off setx JAVA_HOME D:\jdk\jdk1.6.0_20 set PATHD:\jdk\jdk1.6.0_20\bin;%PATH% java -version这里唯一要注意的是PATH变量每次切换时不要把老路径越积越多切几次之后整个PATH会变得很长。建议切脚本里用变量拼接别用追加方式。3.2 IDE和服务器里的版本选择IDEA和Eclipse这类IDE都不会只看系统JAVA_HOME它们有自己管理JDK的方式。Eclipse在Window Preferences Java Installed JREs里手动Add把D:\jdk\jdk1.6.0_20目录加进去再到每个项目的Properties里把Java Compiler的Compliance Level设置成1.6。IDEA则是在Project Structure里设置Project SDK同时在Settings Build Tools Maven里给Importer指定JDK不然Maven可能仍然用命令行的JAVA_HOME去编译。这里有个容易踩的细节如果你的Eclipse是32位的那就只能用32位JDK否则启动时提示“Failed to create the Java Virtual Machine”。别觉得64位JDK能向下兼容IDE自身是通过JNI加载JVM的位不一致就是不行。Tomcat和WebLogic也一样它们虽然会读系统JAVA_HOME但更稳妥的是在各自的启动脚本里显式指定。Tomcat的catalina.bat开头加上set JAVA_HOMED:\jdk\jdk1.6.0_20为什么要这么干因为很多项目同时跑Tomcat和别的中间件某个服务要JDK6、另一个要JDK8如果都靠全局JAVA_HOME去猜迟早有人手滑把全局变量改了导致所有服务跟着遭殃。把启动脚本固化下来一人一套各用各的才算真的省心。搜索里常出现的“jdk tomcat maven版本匹配”本质上就是没有把每条链路使用的JDK版本显式钉死。4. 兼容性排查jdk1.6.0_20容易踩的坑4.1 “找不到JDK”类报错到底是谁在找这个报错方向值得单独拉出来讲。你在安装老软件或者启动某老旧工具时它提示找不到JDK或JRE但你明明已经配好了环境变量。这时候要意识到很多老软件不是通过环境变量来找JDK的它们在Windows下是读注册表里的HKLM\SOFTWARE\JavaSoft信息。你后来装过新版JDK或某些软件附带的JRE注册表里的默认JRE路径被改掉了老软件按注册表找到的可能是一堆残缺文件于是报错。排查手法也别玄学直接在软件的启动脚本里临时加一行echo %JAVA_HOME%再看程序日志。另一种常见情况是安装包本身是32位但机器的JDK是纯64位这也是报找不到的原因。别问我怎么知道的都是血泪。4.2 JDK版本被悄悄换掉日志却还在装傻有一类问题很隐蔽你看生产环境启动脚本里写的JAVA_HOME指向1.6.0_20但应用日志里抓出来的Java版本是8。原因基本是脚本里调用了某个公共配置模板模板里的变量顺序有先后依赖或者另一个脚本设置了一个别名把java指向了其他路径。对应办法是原则性的启动脚本里永远写全路径不要依赖PATH。任何看门狗脚本、定时任务脚本也一样能写全路径就写全路径。搜索词里那个“jdk降级到17”特别有代表性很多人降级后启动Tomcat发现catalina.bat里引用的是全局变量JAVA_HOME而非本地版本改成本地写死后才算消停。4.3 老JDK访问现代HTTPS服务会碰壁这是1.6.0_20特有的麻烦。JDK 6默认启用的TLS协议版本很老现代网站和服务端很多已经禁用了这些老协议你用这个JDK写的客户端去调外网HTTPS接口会直接报SSLHandshakeException。报错信息里往往带一堆handshake alert看起来像是证书问题实际上协议版本对不上。处理这个问题不能指望在这版JDK内部折腾到JDK 6后期虽然可以通过修改java.security里的jdk.tls.disabledAlgorithms参数放开一点但能力非常有限。我实际验证下来最省事的方案是让老系统继续跑在老JDK上但把对外通信的接入层放到一台新版本JDK或独立网关上面由新环境完成TLS握手再通过内部网络把请求转给老系统。这样老系统不用动安全问题也解决了。4.4 常见问题速查现象可能原因处理手段java -version正常但javac无效安装包不含编译器换完整JDK不要用JRE冒充配置完环境变量其他软件异常setx覆盖PATH导致被截断恢复PATH或在图形界面手动追加老程序提示找不到JDK注册表路径被新版本覆盖检查HKLM\SOFTWARE\JavaSoft或写死脚本路径IDE启动报JVM错误32位IDE配了64位JDK换成同位数JDK外部接口SSL握手失败JDK6默认协议过老引入新版本接入层或整体升级JDK5. 升级还是留守我的建议5.1 如果项目还能升级路线其实比想象中好走很多老系统不敢动JDK是因为恐惧来自未知而不是升级本身多难。真要升级我建议按这个顺序来做先把代码和第三方依赖清单摸出来用jdeps工具扫描当前jar包的class版本再看看每个依赖是否提供新版支持。1.6时代的cglib、javassist、老版本Spring在升级到JDK8或更高版本时经常出现反射和字节码层面的兼容问题这是最大的雷。然后搭一套和现在一致的环境把JDK直接切到目标版本跑全量回归。重点关注原有的-GC参数和-XX参数JDK版本变更后很多参数已经移除或改名用原来的启动参数反而可能导致JVM起不来。别急着把代码复杂重构先让它在新版本上跑通观察一段时间的GC日志和线程池表现再谈架构优化。5.2 如果只能留在1.6.0_20怎么过得体面现实点说有些系统因为硬件驱动、银行证书控件或者其他不可替代的外部依赖确实没法短期换掉。这种情况下我建议做“封闭式维护”把老JDK服务的公网暴露降到最低内部通信通过新版本组件做协议转换补丁虽然已经不再有官方公共更新但你仍然要对运行环境内的证书有效期、密钥算法、监控日志保持敏感别让整个系统的安全底线跟着JDK一起停在十年前。最后分享一个我自己的习惯给所有老项目建一个“技术债笔记本”记录每台机器用的JDK具体版本、当时为什么选它、遇到过什么怪问题。等你几个月后再接到一个“帮我看下这个老环境为什么起不来”的请求翻笔记比重新踩一遍坑高效太多。这套办法不只适用于1.6.0_20任何技术栈都一样。本文还有配套的精品资源点击获取