Linux中openjdk-xx-jre仅含JVM与核心类库,不包含javac等开发工具;openjdk-xx-jdk是完整开发包,含编译器、调试器等全套工具,二者独立安装,装jre后javac必然报command not found。

Linux上openjdk-xx-jre和openjdk-xx-jdk是两个独立软件包
在Debian/Ubuntu系(如Ubuntu 24.04)或RHEL/CentOS系发行版中,OpenJDK通常被拆成两个明确用途的包:openjdk-17-jre只含运行时(JVM + 核心类库),而openjdk-17-jdk是完整开发套件,包含javac、javadoc、jshell等工具。它们不互为子集——装了jre包后,javac -version会报command not found,不是路径问题,是根本没安装。
javac缺失就是没装JDK包,不是环境变量没配好
常见误判:看到java -version能输出,就以为“Java环境好了”,结果javac HelloWorld.java失败。这99%是因为只装了jre包。验证方法很简单:
- 运行
dpkg -l | grep openjdk(Debian/Ubuntu)或rpm -qa | grep java(RHEL/CentOS),确认是否含-jdk字样 - 直接执行
which javac,返回空说明该命令不存在,不是PATH漏加 -
apt list --installed | grep jdk比java -version更能反映真实安装状态
ARM与x86架构下包名一致,但二进制不可混用
Ubuntu官方仓库中,openjdk-17-jdk在x86_64和aarch64(ARM64)平台使用相同包名,但底层二进制是架构专用的。如果你在树莓派(ARM)上用apt install openjdk-17-jdk,系统自动拉取ARM版本;在Intel服务器上则拉x86_64版。手动下载tar.gz包时必须核对架构,否则./bin/java会报cannot execute binary file: Exec format error。
生产环境建议直接装jdk包,别省那几十MB
有人为“精简”只装jre,结果CI流水线里编译失败、IDE报Cannot resolve symbol 'java.lang.Object'。实际差异很小:jdk包比jre多约30–50MB,但省掉后续排查时间远超这点磁盘开销。尤其在Hadoop/Flink这类需本地编译或动态生成字节码的场景,javac、jar、jlink都是刚需——这些工具全在jdk包里,jre包里一个都没有。


















