是,debian 10(buster)及更新版本默认源提供 openjdk-11-jdk;debian 9(stretch)仅支持 java 8,强行安装易引发依赖冲突。

Debian 默认源里有 OpenJDK 11 吗?
有,但得看 Debian 版本。Debian 10(Buster)及更新版本的官方源默认提供 openjdk-11-jdk,无需添加第三方仓库。Debian 9(Stretch)则只到 Java 8,硬装 Java 11 会触发依赖冲突或缺失 libjpeg-dev 等底层包,不建议折腾。
验证方法很简单:
apt update && apt list -a openjdk-11-jdk
如果返回空或报 E: No packages found,大概率是系统太老,别强改源,直接升级系统更省事。
安装时该选 openjdk-11-jdk 还是 openjdk-11-jre?
看你要干啥:jre 只能运行 Java 程序,jdk 才能编译、调试、用 javadoc 或 jshell。哪怕只是跑个 Spring Boot 的 jar 包,也建议装 jdk——很多工具(比如 Maven 插件、IDE 启动脚本)内部会调用 javac 或检查 JAVA_HOME 是否指向完整 JDK。
立即学习“Java免费学习笔记(深入)”;
- 开发、构建、CI/CD 环境:必须
openjdk-11-jdk - 纯生产部署且确认无编译/诊断需求:可选
openjdk-11-jre,省约 40MB 磁盘 - 装完后用
update-alternatives --config java确保系统默认指向刚装的版本
java -version 显示 11.0.x 但 javac -version 报 command not found
这是典型只装了 JRE 没装 JDK,或者装了 JDK 但 /usr/lib/jvm/java-11-openjdk-amd64/bin/(路径因架构而异)没进 $PATH。Debian 的 openjdk-11-jdk 包会把 javac 放进这个路径,但它不会自动加进环境变量。
临时修复:
export PATH="/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH"
永久生效要写进 /etc/profile.d/java11.sh(注意不是 ~/.bashrc,后者对 systemd 服务无效):
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' > /etc/profile.d/java11.sh<br>echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/java11.sh
然后执行 source /etc/profile.d/java11.sh 或重启 shell。
Java 11 安装后 JAVA_HOME 指向哪里?
Debian 官方包统一用 /usr/lib/jvm/java-11-openjdk-<strong>arch</strong>(arch 是 amd64、arm64 等)。别手写成 /usr/lib/jvm/java-11-openjdk-amd64/jre ——那是 Java 8 的旧习惯,Java 9+ 的模块化结构下,JAVA_HOME 必须指向顶层 JDK 目录,否则 java --module-path 或 jlink 会找不到 lib/modules。
稳妥做法是用 readlink -f 动态获取:
JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
这个命令在 CI 脚本或容器中比硬编码路径可靠得多。
Java 11 的模块路径和 --add-opens 行为跟 Java 8 差很多,配错 JAVA_HOME 可能导致应用启动失败但错误信息只显示 “Unable to load main class”,实际是模块解析失败。这点容易被忽略。










