ARTICLE DETAIL

资讯详情

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

免安装版JDK 1.8详解:从环境变量配置到Docker镜像实战

免安装版JDK 1.8详解:从环境变量配置到Docker镜像实战 简介一份免安装版的jdk1.8工具包面向需要快速搭建Java运行环境、又不想变更系统原有JDK版本的开发与运维人员解压后即可通过自定义路径调用适合服务器多版本JDK并存、项目临时部署或学习测试等场景。压缩包为rar格式共1622个文件约148.24MB内含717个jar核心类库、230个xml配置、66个so动态库以及properties、html、png、gif、css等辅助资源目录结构完整可从lib目录快速定位依赖也可参考bin目录下的可执行命令按需使用。已有285人学习/下载。使用方式很简单可将该JDK放在如/usr/local/jdk1.8的独立目录在启动脚本中通过/usr/local/jdk1.8/bin/java -Xms256m -Xmx512m -jar alipayJr45LogUploadLogfile.jar这类命令启动应用只影响当前进程不会污染系统全局环境也不会干扰其他Java服务。这份包体适合需要隔离JDK版本的项目部署、CI脚本集成、教学环境搭建等场景能够有效避免环境变量冲突并方便多版本快速回退。1. 为什么我坚持用免安装版JDK 1.8先交代个背景这些年我在本地开发环境、服务器部署、还有帮同事配环境时经手过的 JDK 版本十个手指头数不过来装来装去最后还是回到了 JDK 1.8也就是 Java 8。虽然 Oracle 早就停止了对 Java 8 的免费商用更新但 Spring Boot 2.x、Hadoop 生态、很多老项目还有一堆内部系统全跑在这上面。你说 Java 17 很香、Java 21 更快我认但生产环境里 Java 8 的存量依然惊人。对一个开发者来说手头备一个免安装版的 JDK 1.8 是刚需。所谓免安装版就是绿色版官方术语叫 ZIP 包解压版。它不需要像 exe 安装包那样走一遍安装向导不需要往注册表里写信息也不需要管理员权限就能完成部署。你只需要把压缩包解压到某个目录把环境变量配好Java 环境就算搭好了。这个方案最大的优势在于两点一是可移植性强整个 JDK 目录拷到另一台机器上改一下环境变量路径就能用二是环境隔离干净想用多个 JDK 版本随时切换不用反复卸载重装。这篇内容我会从免安装版 JDK 1.8 的获取、解压、环境变量配置、验证方式到 32 位系统的特殊处理再到结合 Spring Boot 打包 Docker 镜像的实际场景一步步说清楚。适合刚入门的 Java 学习者也适合要批量部署环境、或者想把 JDK 8 做成基础镜像的运维和开发同学。2. 为什么免安装版比安装包更省心2.1 安装包和免安装版的差别在哪很多人第一次接触 JDK 都是去官网下载 exe 安装包双击、下一步、下一步、完成感觉挺顺利的。但用到后面你就会发现问题安装版会把 JDK 的文件散落到系统目录里还会向注册表写入配置卸载的时候经常残留一堆东西。最难受的是如果你想在同一台机器上共存 JDK 8 和 JDK 17用安装版来回折腾简直是灾难。免安装版完全没有这些问题。它就是一个 ZIP 压缩包里面是完整的 JDK 目录结构包括bin、jre、lib等文件夹。解压到哪里哪里就是 JDK 的根目录。要切换版本的时候只需要把JAVA_HOME指到不同的解压目录打开新终端窗口即可生效。我常用的做法是在D:\dev\java目录下放jdk1.8.0_202和jdk-17两个文件夹需要哪个就把JAVA_HOME指过去实测下来非常稳定。用安装版还有一个隐藏坑Oracle 的 JDK 安装包会附带安装公共 JRE并且会启动 Java Update 计划任务时不时弹窗提醒你更新版本。在一些内网隔离、对版本敏感的环境里突然弹个更新提示是件挺烦人的事情。免安装版不存在这种干扰它就是一堆纯粹的文件不碰你系统里任何其他东西。2.2 解压版目录结构怎么看我在这里插一句不管你是第一次用解压版还是老手解压完成后都建议先看一眼目录结构确认这个包是完整的。标准的 JDK 8 解压目录应该包含这些关键部分bin/Java 工具入口java.exe、javac.exe、jar.exe等可执行程序都在这里jre/Java 运行时环境JVM 本体就在这里lib/JDK 运行所需的库文件和工具包include/本地接口相关的 C/C 头文件做 JNI 开发时会用到src.zipJDK 部分源码看集合类、String 实现时很有用把解压目录叫做JAVA_HOME在环境变量里指向它后续所有依赖 Java 的工具都会基于这个路径去找运行时。这也是为什么我强烈建议目录里不要带中文和空格最好也用纯英文路径。比如D:\dev\jdk1.8.0_202比C:\Program Files\Java\jdk1.8.0_202省心得多因为某些老旧的第三方工具在处理带空格的路径时会有兼容性问题。3. 免安装版 JDK 1.8 的获取与环境变量配置3.1 从哪下载怎么选版本免安装版 JDK 1.8 的获取源主要有几个Oracle 官网的 Java Archive 页面提供历史版本下载需要注册登录才能获取Adoptium也就是 Eclipse Temurin和 Amazon Corretto 等发行版也提供了 ZIP 格式的压缩包。不过国内用户访问这些站点速度可能不理想也可以从国内一些高校镜像站或云厂商的镜像地址下载文件内容是一样的校验完 MD5 或 SHA256 摘要即可放心使用。选版本的时候要注意后缀jdk-8u202-windows-x64.zip表示 8 更新 202 版本64 位 Windowsjdk-8u202-linux-x64.tar.gz是 Linux 版。如果是 32 位系统要选windows-i586后缀的包。这里有个冷知识很多人以为 i586 就是奔腾处理器其实 Java 官方一直用这个标识表示 32 位 x86 架构。在 Windows 平台拿到压缩包后用解压工具解压即可别直接双击压缩包里的java.exe运行那只是临时生效没有任何配置意义。解压完成后把整个文件夹放到一个固定的、路径简单的目录下这一步就算完成了。3.2 Windows 环境变量设置的完整步骤解压本身没有技术含量真正的关键步骤在环境变量配置上。Windows 系统下按下Win R输入sysdm.cpl打开系统属性切到高级点环境变量开始配置。这里分三个变量讲清楚JAVA_HOME在系统变量区域新建一个变量变量名填JAVA_HOME变量值填你的 JDK 解压路径比如D:\dev\jdk1.8.0_202。这个变量就是整个 Java 环境的根索引后面所有工具都靠它来定位。PATH找到系统变量里的Path点编辑新建一行%JAVA_HOME%\bin。Windows 会把它自动解析成D:\dev\jdk1.8.0_202\bin。把这条放在 PATH 的靠前位置可以让系统在执行java、javac命令时优先找到这个目录。CLASSPATH这个变量在新版 JDK 里已经不需要手动配置了。Java 5 以后 JVM 会默认加载当前目录的类文件。如果你是老教程的忠实读者非想配的话记住这个格式.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar最前面的.;表示当前目录。但我要说明白我在新机器上从不配置这个变量从来没出过问题。配置完成后打开一个全新的命令提示符窗口输入java -version验证。注意是全新的窗口不是原来的旧窗口因为环境变量的读取发生在进程启动时旧窗口不会刷新变量值。能看到类似下面的输出说明配置成功java version 1.8.0_202 Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)3.3 Linux 服务器上怎么配Linux 上的配置更简单。把jdk-8u202-linux-x64.tar.gz上传到服务器后解压到指定目录然后编辑/etc/profile文件在末尾追加export JAVA_HOME/usr/local/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar保存后执行source /etc/profile让配置立刻生效。这里有个小提示有些发行版预装了 OpenJDK其java命令可能被软链接到了/usr/bin/java。你想用自己解压的 JDK就把JAVA_HOME/bin放在 PATH 的前面或者在~/.bashrc里覆盖默认配置。我在 CentOS 7 上处理这个问题时习惯直接删掉/usr/bin/java的软链接然后重新ln -s指向自己的 JDK避免歧义。4. 免安装版 JDK 1.8 的验证与快速切换版本4.1 多 JDK 版本共存的切换技巧免安装版最大的福利就是支持多版本共存切换成本极低。我在本机常驻三个 JDK1.8、11、17分别放在同一个父目录下。切换的方法其实就是改JAVA_HOME的指向。Windows 下我写了一个简单的批处理脚本来完成切换echo off set /p version请输入要切换的JDK版本(8/11/17): if %version%8 setx JAVA_HOME D:\dev\jdk1.8.0_202 if %version%11 setx JAVA_HOME D:\dev\jdk-11.0.18 if %version%17 setx JAVA_HOME D:\dev\jdk-17.0.6 echo 请重新打开命令行窗口使配置生效setx命令把变量写入用户级注册表新开的终端才会读到新值。这个方案的乐趣在于我可以在同一个项目里用 JDK 8 编译产物、用 JDK 17 跑新项目相互之间完全不干扰。4.2 如何判断当前生效的是哪个 JDK刚配好环境变量或者切换完版本别急着写代码先验证一下当前环境到底用的哪个 JDK。除了java -version还可以用where java看看可执行文件的实际路径。我遇到过不少次环境变量配了但执行java命令时仍然提示找不到或版本不对的情况。原因基本都是 PATH 里其他位置的java.exe优先于JAVA_HOME\bin被找到了。Windows 下可以用命令确认优先级where java如果输出的第一个路径不是你的JAVA_HOME\bin\java.exe说明还有别的位置抢先了。比如有些软件安装时会往 PATH 里加自己的 Java 路径或者 Oracle 安装包把C:\ProgramData\Oracle\Java\javapath塞进了 PATH 的靠前位置。解决办法是把%JAVA_HOME%\bin在 PATH 里上移到这个路径之前或者直接删掉这条 Oracle 的路径。这种优先级问题在 Mac 上同样存在/usr/bin/java 只是 stub真正用法是配合 /usr/libexec/java_home 工具来管理。4.3 不配环境变量也能用的黑科技如果只是临时想跑一段代码不想动系统的环境变量其实可以不依赖JAVA_HOME和 PATH直接用完整路径执行。比如D:\dev\jdk1.8.0_202\bin\java.exe -version D:\dev\jdk1.8.0_202\bin\javac.exe Main.java这种方式对一次性使用场景很友好比如用某台机器验证某个 JDK 版本的兼容性又不想影响原有环境。有一个 IDE 是这么运作的你指定了 JDK 的路径它直接调java.exe的绝对路径来执行编译和运行完全绕开系统环境变量。IntelliJ IDEA 就是这么干的所以有时候你命令行里 java 版本和 IDEA 里显示的不一致原因就在这。5. 32 位免安装版 JDK 的特别处理5.1 哪些场景还在用 32 位 JDK不是所有人都用 64 位系统。还有一些老旧的 Windows Server 2008 32 位系统、老款工控机、银行或政务内网的终端设备上面跑着老项目只支持 32 位 JDK。如果你在这些环境里部署 Spring Boot 项目或者老 Web 应用就需要准备 32 位版本的免安装 JDK。32 位版 JDK 1.8 的命名后缀是windows-i586。下载的时候一定要看清楚别拿 64 位包去解压到 32 位系统上会直接提示不是有效的 Win32 应用程序。同时注意32 位 JDK 只能运行 32 位 JVM堆内存上限大约只能设置到 1.5GB 左右不是你想配 4GB 就能配上去的JVM 会直接拒绝启动。5.2 内存配置的差异性在 32 位 JVM 上跑应用内存参数要保守一些。-Xmx设置超过 1.5GB 时JVM 启动会报Could not reserve enough space for object heap错误。这不是配置写错了而是 32 位进程地址空间本身的限制。我维护的一个老旧信息系统就是跑在 Windows Server 2008 R2 32 位环境下的-Xmx只能设置到 1280m超出一点就给你看脸色。所以如果是 64 位系统优先用 64 位 JDK只有系统本身是 32 位、或者需要兼容 32 位本地库DLL/SO时才考虑 32 位 JDK。这里又一个注意事项有些老项目用了 32 位版本的 JNI 本地库换到 64 位 JDK 会报UnsatisfiedLinkError这时候保留 32 位环境是无奈但合理的选择。6. 免安装版 JDK 1.8 在 Docker 场景中的实战6.1 为什么 Docker 里免安装是标配Docker 镜像的构建过程本质上是把一个可运行的根文件系统打包起来。在这个语境下免安装版 JDK 的优势被发挥到极致——你不需要在镜像里跑一个交互式安装程序直接 COPY 一个解压好的 JDK 目录进去就行。任何交互式安装操作在 Dockerfile 里都是噩梦silent 参数写错一个就白构建好几层。现在大家常用的eclipse-temurin:8-jdk、openjdk:8-jdk-alpine这些基础镜像本质上就是官方团队帮你把免安装版 JDK预制好了放到镜像里。这些镜像下载下来后JDK 直接位于/opt/java/openjdk或/usr/local/openjdk-8目录下环境变量也已经配好开箱即用。6.2 Spring Boot 项目打包到 Docker Desktop 的完整流程结合目前很火的 Spring Boot JDK 1.8 打包到 Docker Desktop 这个话题我详细说说操作流程。假设你的开发机装了 Docker Desktop有一个基于 Spring Boot 2.x 的项目目标运行时是 JDK 8。先写一个Dockerfile# 基础镜像直接选用 Temurin 8它就是免安装版JDK 的容器化形态 FROM eclipse-temurin:8-jdk # 设置工作目录 WORKDIR /app # 把项目打出来的 jar 包复制进去 COPY target/demo-0.0.1-SNAPSHOT.jar /app/app.jar # 暴露服务端口 EXPOSE 8080 # 启动命令 ENTRYPOINT [java, -jar, /app/app.jar]然后执行mvn clean package docker build -t demo-jdk8 . docker run -d -p 8080:8080 --name demo-jdk8 demo-jdk8到这一步如果一切顺利一个基于 JDK 8 的 Spring Boot 服务就在 Docker Desktop 里跑起来了。但这里有个常见的坑Docker 容器里的 JVM 和宿主机共享内核默认情况下 JVM 识别到的 CPU 和内存是整个宿主机的资源而不是容器限制的资源。在容器里跑 Java 8 应用需要加 JVM 参数来限制堆内存ENTRYPOINT [java, -XX:UseContainerSupport, -Xmx512m, -jar, /app/app.jar]JDK 8u191 以上版本默认开启容器感知也就是UseContainerSupport但如果你的镜子用的是旧版本 JDK 8u181 或者更早JVM 不会识别容器的内存限制可能直接把宿主机内存耗光。这种情况下建议在启动命令里显式加上并设置合理的-Xmx。6.3 自制免安装 JDK 8 基础镜像如果你对官方镜像有顾虑比如网络下载慢、担心供应链问题、或者需要在离线环境部署完全可以自己做一个镜像。思路很直接把免安装版的 JDK 8 压缩包放到一个干净的镜像里然后解压配置。给一个最小化的 DockerfileFROM ubuntu:20.04 # 拷贝免安装版 JDK 压缩包到镜像 COPY jdk-8u202-linux-x64.tar.gz /tmp/ # 解压并移动到标准路径 RUN tar -xzf /tmp/jdk-8u202-linux-x64.tar.gz -C /opt/ \ mv /opt/jdk1.8.0_202 /opt/java \ rm /tmp/jdk-8u202-linux-x64.tar.gz # 配置环境变量 ENV JAVA_HOME/opt/java ENV PATH$JAVA_HOME/bin:$PATH # 验证 RUN java -version构建命令docker build -t my-jdk8:base .这种自制的镜像在离线环境中尤其好用。我把这个镜像推送到私有 Harbor 仓库后内网的部署机可以不访问外网直接拉取。之前帮朋友搭内网环境时靠这个办法解决了完全没有外网连接的难题。不过要注意基础镜像的选择尽量用ubuntu:20.04或debian:bullseye-slim这类体积小、依赖全的镜像别用scratch那里面连/bin/sh都没有JDK 解压完也起不来。6.4 自制镜像过程中的常见问题自制 JDK 镜像时最容易遇到的问题是缺依赖。官方镜像里已经内置了 JDK 运行所需的库但基于精简版 Linux 制作的镜像可能需要额外安装一些库。Debian/Ubuntu 系列基础镜像需要安装这些库才能稳定运行 Java 8RUN apt-get update apt-get install -y \ fontconfig \ libfontconfig1 \ libfreetype6 \ rm -rf /var/lib/apt/lists/*不装 fontconfig 的后果是java.awt.Font相关的操作会抛异常。比如做图形验证码、导出 Excel 里嵌图时经常会触发字体错误。Ive spent a whole afternoon on this before是因为项目中用到了 java.awt 生成验证码换成完整镜像后瞬间解决。另外一个坑是 locale 相关的问题。如果你的镜像没有正确配置 localeJava 处理中文文件名或输出中文日志时可能会出现乱码。解决办法是在 Dockerfile 里设置环境变量ENV LANGC.UTF-8 ENV LC_ALLC.UTF-87. 常见问题与避坑锦囊7.1 环境变量配置失败排查法遇到过太多明明配好了 JAVA_HOME 为什么 java 命令不可用的问题。这里给出一套排查流程按顺序走完基本能解决 95% 的问题症状可能原因排查思路java不是内部或外部命令PATH 没生效或者没填写%JAVA_HOME%\bin检查 PATH 变量里是否有%JAVA_HOME%\bin然后重新打开终端java -version显示的版本不对其他 Java 在 PATH 中优先级更高运行where java查看实际路径调整 PATH 顺序新配置的JAVA_HOME不生效终端窗口未刷新环境变量必须全新打开终端或重启 IDE编译正常但运行报NoClassDefFoundError缺少依赖库或 classpath 不完整检查运行时依赖用-cp指定完整 classpath7.2 免安装版会遇到的灵异事件免安装版 JDK 最常见的怪异问题就是明明把JAVA_HOME指到了 A 目录运行的却是 B 目录的版本。这其实是 Windows 的 PATH 目录搜索顺序导致的。举个例子你的 PATH 里先有C:\Program Files\Common Files\Oracle\Java\javapath后面才有%JAVA_HOME%\bin系统会先找到前者里面的java.exe。解决办法是把%JAVA_HOME%\bin在 PATH 里上移最好放在第一行。还有一种情况是 IntelliJ IDEA 自带了 JBRJetBrains Runtime项目 SDK 设置的 JDK 版本和命令行下看到的版本不一致。这属于 IDE 的独立配置不读系统环境变量。解决办法是在 IDEA 的 Project Structure 里显式指定 SDK 路径指向你的解压目录。7.3 一些实用的小习惯关于免安装版我从实际使用中总结出几个习惯供参考定期备份。免安装版 JDK 最大的好处就是可以整体压缩备份。我曾在官网下架某个版本的 JDK 8 后靠本地一份 zip 备份救了一个需要精确版本复现的 bug。所以把下载好的安装包按版本号分目录存好这种一次下载永久使用的便利性是安装版给不了的。确认版本号。很多人以为JAVA_HOME配好了就完事了实际上一台机器上可能有多个 Java 相关软件Maven、Gradle、Tomcat、Android Studio 等等它们的 Java 环境可能是独立配置的。比如 Maven 使用JAVA_HOME环境变量但 Tomcat 可以在setenv.sh里单独指定 JRE 路径。改了全局JAVA_HOME不一定对 Tomcat 生效。分清了这套逻辑遇到为什么我改了版本没反应的问题就很清晰了。用工具辅助管理。Windows 下可以尝试jenv一个 Python 写的 Java 环境管理器或者 IDE 自带的 SDK 管理功能。不过对 JDK 8 用户来说我个人觉得手动管理更稳妥。jenv对 Windows 的支持不算特别好我试过几次后放弃了脚本管理更直接可控。8. 说说这块绿色 JDK的上限聊到这儿免安装版 JDK 1.8 的核心玩法基本讲透了。从下载解压到环境变量从 32 位系统的头疼事到 Docker 镜像的便捷复用这套绿色理念贯穿始终。在 Java 版本快速迭代的今天保留一个随时可用的 JDK 8 环境不是守旧而是实用主义的选择——它是无数老系统稳定运行的基石。我个人的经验是免安装版 JDK 最大的价值就是可控。版本可控、路径可控、行为可控。它不偷偷塞注册表项不悄悄计划任务需要它时它就在那里不需要时一键删除不留痕迹。对开发者来说这种极简的掌控感本身就是效率的一部分。最后分享一个小诀窍每次把 JDK 解压到新机器之后顺手执行一下java -XshowSettings:properties -version可以看到当前 JVM 完整的属性列表包括 home 路径、版本号、文件编码一条命令确认所有关键配置比反复开窗口验证省事得多。本文还有配套的精品资源点击获取
返回列表