jdk1.8以上的版本(jdk9,jdk11,jdk17等)没有jre的问题
前置条件
本文默认读者已经设置完毕了jdk运行的环境,java、javac相关的命令已经是可用状态。
一、解决问题
打开windows的命令行工具
打开 Windows powerShell(管理员),切记是管理员权限的 Windows powerShell ,这一步很重要!
进入jdk安装目录
执行 :
cd "C:\Program Files\Java\jdk-17"
我的版本是17,读者可以根据自己的jdk安装路径进入对应的安装目录
生成所需的jre
执行命令:
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
二、可能的问题
有的小伙伴执行完:C:\Program Files\Java\jdk-17>bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
出现错误提示:错误: C:\Program Files\Java\jdk-17\jre
原因是:Windows powerShell 并没有使用管理员身份打开。
三、探究原因:为什么jdk1.8之后的jdk不再单独安装jre了?
我们首先可以从 Oracle 的 Java SE 9 的下载页初见端倪:
WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in production.
警告:提供这些旧版本的JRE和JDK是为了帮助开发人员调试旧系统中的问题。它们未使用最新的安全修补程序进行更新,不建议在生产中使用
我觉得这也是自从JDK 9开始引入 module system 之后,自然而然的动作。
Java平台的领导者们意识到了随着虚拟化、容器化、微服务化的普及和流行,以前庞大的JRE已经跟不上时代的发展:作为一个运行时,里面经常包含了太多不需要的东西。
比如,如果一台主机上的某个JRE仅仅是用来运行Apache Tomcat,那么JRE中用来支持SWT的部分肯定是不需要的,即浪费空间又降低效率。引入module system,使得开发者能够按自己的应用创建一个最小的运行时成为了可能——你的一个微服务的部署应用仅仅需要一个非常小的 runtime(比如仅仅20m)——而不是像以前一样不管应用复杂还是简单,都需要一个上百兆的JRE作为运行 runtime,横向扩展和部署的效率将能大幅提升。
作为一个Java开发者,这个改变我觉得是值得让我们高兴的,这是一种进步,说明了Java平台一直在尝试紧跟时代,而不用担心被淘汰。
回到最初引用的那句话——因为你可以用jlink根据自己的需求,创建一个更小的运行时,而不是不管什么应用,都是同样的JRE。