推荐Linux手动安装OpenJDK至/usr/local/java/,因其符合FHS标准、避免系统包冲突且利于多版本管理;macOS必须置于/Library/Java/JavaVirtualMachines/并以.jdk结尾;Windows宜用D:\jdk17\等无空格纯英文路径。

Linux 上 OpenJDK 安装目录推荐放 /usr/local/java/
系统包管理器(如 yum 或 apt)安装的 OpenJDK 通常走默认路径,比如 /usr/lib/jvm/java-17-openjdk-amd64/;但手动解压 tar.gz 包时,/usr/local/java/ 是最稳妥的自定义位置。
原因很实际:它符合 FHS(文件系统层次结构标准),是专为“本地管理员安装的软件”预留的,不会和系统包冲突,也方便后续多版本共存管理。
- 避免放在
/opt/—— 虽然常见,但部分发行版(如 CentOS Stream)对/opt的权限或 SELinux 策略更严格,容易导致java命令执行失败 - 不要放在用户家目录(如
~/openjdk)—— 其他用户或系统服务(如 systemd 服务、CI agent)无法访问 - 别用
/usr/java/—— 这是 Oracle JDK 传统路径,OpenJDK 手动安装后可能被update-alternatives误识别为 Oracle 版本,引发java -version显示异常
macOS 上必须用 /Library/Java/JavaVirtualMachines/
macOS 的 Java 运行时机制(JVM discovery)硬编码依赖这个路径。哪怕你把 OpenJDK 解压到 /opt/jdk 并配好 JAVA_HOME,/usr/bin/java 仍可能调不到它,尤其在 IDE(IntelliJ、Eclipse)或脚本中调用 java 命令时。
正确做法是:解压后重命名为 jdk-17.0.2.jdk 这类带 .jdk 后缀的 bundle 目录,再移到 /Library/Java/JavaVirtualMachines/ 下。
-
which java返回的是/usr/bin/java,它只是个代理,真正加载哪个 JVM 由/Library/Java/JavaVirtualMachines/下的 bundle 决定 - 如果放错位置(比如
~/jdk),java -version可能显示正常,但javac编译或 JNI 调用会静默失败 - macOS Ventura 及更新版本默认 shell 是
zsh,JAVA_HOME必须指向 bundle 内的Contents/Home,例如:/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home
Windows 上建议避开空格和中文路径
OpenJDK 本身不排斥空格,但大量 Java 工具链(Maven、Gradle 插件、Ant、旧版 Tomcat)在解析 JAVA_HOME 时仍用老旧的字符串分割逻辑,遇到 C:\Program Files\Java\... 极易出错。
最省事的路径是 D:\jdk17\ 这类纯英文、无空格、盘符非系统盘的路径。
- 不要用
C:\Java\—— Windows Defender 可能对 C 盘根目录下新建的 Java 目录做额外扫描,首次运行java会卡顿数秒 - 别把 JDK 和 JRE 分开放 —— OpenJDK tar.gz 包已自带 JRE,再单独装一个 JRE(尤其不同版本)会导致
java和javac指向不一致,ClassNotFoundException风险陡增 - 确认路径末尾没有反斜杠(
\)——JAVA_HOME=D:\jdk17\在某些批处理中会被截断,应写成D:\jdk17
多版本共存时目录结构要扁平化
如果你计划同时维护 JDK 8、17、21,别嵌套成 /usr/local/java/jdk17/jdk-17.0.2/ 这种三层结构。直接一级展开更可靠:
ls -F /usr/local/java/ jdk8/ jdk17/ jdk21/
这样配合 update-alternatives 或 shell 函数切换时,路径引用干净,ls /usr/local/java/jdk17/bin/java 能直通,不会因多一层子目录导致 bin 不在预期位置。
- 每个子目录里必须包含完整的
bin/、lib/、jre/(OpenJDK 17+ 已无独立 JRE 目录,但bin/java必须存在) - 不要用符号链接替代真实目录 —— 某些构建工具(如 Bazel)会校验
JAVA_HOME是否为真实路径,软链可能被拒绝 - 权限问题常被忽略:
/usr/local/java/目录需保证当前用户有读+执行权限(rx),否则java -version会报Permission denied,即使文件明明存在


















