资讯动态

免安装JDK 17实战:解压即用与jlink裁剪交付

发布时间:2026/10/20 18:41:52 来源:尧图企业网站定制
简介这是一份面向Java开发者、教学培训人员及初学者的JDK 17.0.7免安装压缩包旨在绕开Oracle官网注册登录的繁琐流程解压即可搭建开发环境适合需要频繁切换环境或快速上手的场景。资源共417个文件压缩包约168.46MB内含86个dll动态库、35个exe可执行程序、71个jmod模块文件及大量license、copyright授权说明另附cacerts证书、jvm.cfg配置、classlist类清单等核心组件覆盖Windows、Linux、macOS多平台运行所需。目前已有747人学习下载。解压后可直接调用javac、java等命令行工具省去安装向导与环境变量反复配置的麻烦即开即用便于教学演示、项目快速启动与多版本环境并行管理是提升Java开发效率的实用工具包。1. 免安装 JDK 17 到底省了什么从解压到能跑 Hello World 的十分钟你有没有遇到过这种场景新拿到一台测试机或者临时要在某台内网机器上验证一段 Java 代码结果发现系统里只有 JRE 没有 JDK连javac都找不到。想去官网下一个先要注册账号、填一堆信息、收邮件点确认折腾十几分钟才拿到下载链接网速再一抖半小时就没了。这份 jdk-17.0.7 的免安装压缩包解决的正是这个「只想快速把编译环境跑起来」的诉求——解压、配两个环境变量、敲java -version看到版本号前后不超过十分钟。它本质上是把官方 JDK 17.0.7 的目录结构原样打包成 zip没有安装器、不写注册表、不改系统目录所有文件都在你解压出来的那个文件夹里。这意味着你可以把它丢进 U 盘、放进项目仓库的tools/目录、甚至塞进 Docker 镜像的构建上下文随用随取。适合谁一是经常要在多台机器上切换 Java 版本的开发者二是做 CI 流水线时需要固定 JDK 版本的运维三是学生或刚入门的人不想被安装器里那些「公共 JRE」「开发工具」的勾选项绕晕。不适合谁需要系统级注册、依赖JAVA_HOME被其他安装程序自动识别的场景那还是走安装版更省心。2. 解压前后要盯住的目录结构bin、lib、jmods 各管什么2.1 解压后第一眼该看哪里把 zip 解压到任意目录比如D:\dev\jdk-17.0.7或/opt/jdk-17.0.7你会看到这样一层结构jdk-17.0.7/ ├── bin/ # 可执行文件java、javac、jar、jlink、jshell 等 ├── conf/ # 配置文件net.properties、security/ 下的策略文件 ├── include/ # JNI 头文件写 native 扩展时才用 ├── jmods/ # 模块化系统的 .jmod 文件jlink 裁剪运行时靠它 ├── legal/ # 各模块的许可证声明 ├── lib/ # 核心类库、模块文件、字体、时区数据 └── release # 版本元信息纯文本关键点在于bin和lib必须保持相对位置不变。有人图省事只把bin目录拷到别处结果java启动时报「找不到或无法加载主类」因为lib/modules不在预期路径下。免安装版的「免」是免去安装流程不是免去目录完整性。2.2 环境变量到底配哪几个Windows 上我一般只动两个JAVA_HOME指向解压根目录Path里追加%JAVA_HOME%\bin。Linux/macOS 则在~/.bashrc或~/.zshrc里写# JDK 免安装版环境变量路径按实际解压位置改 export JAVA_HOME/opt/jdk-17.0.7 export PATH$JAVA_HOME/bin:$PATH # 可选让 jlink 生成的镜像也能被找到 export JDK_HOME$JAVA_HOME逻辑说明JAVA_HOME是给 Maven、Gradle、Tomcat 这类工具读的它们靠这个变量定位编译器PATH是给 shell 读的让你在任何目录下都能直接敲java。参数上唯一要注意的是顺序——$JAVA_HOME/bin放在$PATH前面否则系统里如果已有旧版 Java会优先命中旧的。改完执行source ~/.bashrc再echo $JAVA_HOME确认路径没有多余空格或引号。2.3 验证是否真的可用别只看java -version那只证明运行时在。编译链也要过一遍# 三连验证运行时、编译器、模块工具 java -version javac -version jlink --version三个命令都返回 17.0.7 才算完整。如果javac报「不是内部或外部命令」八成是PATH没生效或者bin路径拼错。这时候别急着重启先which javacLinux或where javacWindows看解析到哪个路径比盲目改环境变量快得多。3. 把 JDK 17 接进项目Maven、Gradle 与 IDE 的版本对齐3.1 Maven 的 toolchain 与 compiler 插件免安装 JDK 最大的价值在于「多版本共存」。你可以在同一台机器上放jdk-17.0.7和jdk-11让不同项目各用各的。Maven 里最稳的做法是配maven-compiler-pluginplugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version configuration !-- 源码和目标字节码都锁 17避免用高版本 JDK 编出低版本不认的 class -- source17/source target17/target encodingUTF-8/encoding /configuration /plugin参数说明source是语法级别target是字节码级别两个都写 17 最省事。如果你用 JDK 17 去编一个要求 Java 8 的老项目把这两个值改成 8但注意 JDK 17 已经移除了对 8 以下的支持source 7会直接报错。常见翻车点是只改了 IDE 的 Language Level没改 pom结果命令行mvn package出来的 class 版本和预期不符。3.2 Gradle 的 java toolchainGradle 7.3 以后推荐用 toolchain它能自动发现你解压的 JDKjava { toolchain { // 指定用 17Gradle 会去常见路径和 JAVA_HOME 下找 languageVersion JavaLanguageVersion.of(17) } }逻辑说明toolchain 的好处是构建脚本声明「我要 17」具体用哪个安装由 Gradle 解析团队里有人用安装版、有人用免安装版都能跑。如果 Gradle 找不到在gradle.properties里加一行org.gradle.java.installations.paths/opt/jdk-17.0.7显式指路。这个属性支持逗号分隔多个路径多版本共存时特别有用。3.3 IDE 里别选错 SDKIntelliJ IDEA 里File → Project Structure → SDKs添加解压目录然后在Project页把 SDK 和 Language Level 都设成 17。Eclipse 则在Preferences → Java → Installed JREs里 Add 标准 VM指向解压根目录。这里有个血泪经验IDE 有时会缓存旧的 SDK 索引改完路径后如果补全还是报错File → Invalidate Caches走一遍比反复删.idea目录温和。4. 免安装版的坑路径空格、模块缺失与版本混用排查4.1 路径里有空格或中文现象java -jar启动时报Error: Could not find or load main class但 class 文件明明存在。 原因解压到了C:\Program Files\jdk-17或带中文的目录某些脚本拼接路径时没加引号空格被当成参数分隔符。 解决换到无空格无中文的路径比如C:\dev\jdk17。这是最省事的做法别去改脚本转义后面还会在别处冒出来。4.2 jlink 裁剪后运行时报模块缺失现象用jlink生成精简运行时跑起来提示Module java.base not found或某个java.sql相关类找不到。 原因jlink只打包你--add-modules里列出的模块JDBC 驱动依赖java.sql没加就缺。 解决先java --list-modules看全量模块名再按需加。常用组合是--add-modules java.base,java.sql,java.logging。拿不准就先用--add-modules ALL-MODULE-PATH跑通再逐步裁剪。4.3 系统里旧版 Java 抢先命中现象配好了JAVA_HOME但java -version显示的还是 1.8。 原因Windows 的Path里C:\ProgramData\Oracle\Java\javapath排在前面或者 Linux 的/usr/bin/java是软链到旧版。 解决Windows 把%JAVA_HOME%\bin上移到最前Linux 用update-alternatives --config java切换或者直接在PATH里把$JAVA_HOME/bin放最前。改完开新终端验证旧终端的环境变量不会自动刷新。4.4 误删 lib 下的 modules 文件现象java能启动但一跑稍微复杂的程序就NoClassDefFoundError。 原因有人为了「精简」把lib/modules删了以为那是缓存。实际上 JDK 9 以后核心类库都在这个 jimage 文件里。 解决重新解压一份别手动删lib下任何文件。免安装版占的空间主要就在这几百 MB 换的是完整性。4.5 多版本切换时忘了改 JAVA_HOME现象命令行java是 17但 Maven 构建报「不支持发行版本 17」。 原因Maven 读的是JAVA_HOME而 shell 的java可能来自PATH里另一个版本两者不一致。 解决mvn -version会打印它实际用的 Java 路径拿这个和echo $JAVA_HOME对一下不一致就改JAVA_HOME。养成习惯切版本时JAVA_HOME和PATH一起改别只改一个。5. 用 jlink 和 jpackage 把免安装 JDK 变成交付物免安装 JDK 真正好用的地方是它能当「母体」去生成更小的运行时。假设你写了个小工具只想给同事一个双击就能跑的包不需要他们装 Java可以这么做# 第一步用 jlink 裁剪出只含必要模块的运行时 jlink --add-modules java.base,java.desktop \ --strip-debug \ --no-header-files \ --no-man-pages \ --compress2 \ --output myapp-runtime # 第二步用 jpackage 把运行时和 jar 打成安装包 jpackage --type app-image \ --name MyTool \ --input target/ \ --main-jar mytool.jar \ --main-class com.example.Main \ --runtime-image myapp-runtime逻辑说明jlink的--strip-debug去掉调试符号--compress2压缩--no-header-files和--no-man-pages去掉 native 开发和手册一个最小运行时能压到 40MB 左右。jpackage的--type app-image生成免安装目录换成--type msi或--type deb则生成对应平台安装包。参数上--runtime-image指向上一步产物--main-class要和 jar 里的入口一致。验证方法把生成的MyTool目录拷到一台没装 Java 的机器上直接运行。如果报Failed to launch JVM八成是jlink时漏了模块用jdeps分析依赖# 分析 jar 依赖哪些模块输出到控制台 jdeps --multi-release 17 --print-module-deps target/mytool.jar这条命令会打印类似java.base,java.desktop,java.logging的列表直接复制进jlink --add-modules即可。我一般会在这个列表基础上多加一个jdk.crypto.ec因为 HTTPS 请求偶尔会用到不加的话在特定场景下会报算法不可用排查起来很费时间。从那以后我每次拿到新的免安装 JDK都强制走一遍「解压 → 配 JAVA_HOME → 三连验证 → jdeps 看依赖」的流程不跳过任何一步。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑