如何在Java 11中使用没有jre的jdk

Mah*_*Lak 45 java migration java-8 java-11

我们计划将Java 8项目迁移到使用Java 11.但是我注意到Java 11没有JRE文件夹.

在Java 9和Java 10中,文件夹结构被更改,即,java\jdk1.x或者java\jre1.xxjava 9或10中.

但是在Java 11中,我只获得了一个文件夹,即java\jdk-11.如果没有jre,我的客户如何使用我的应用程序?

我所理解的是Java 11正在强制模块化我们的应用程序,并且需要使用jlink来创建我们自己的jre以在客户端中运行应用程序.

我的理解是否正确?

jwe*_*ing 64

20年来,JDK附带了一个JRE,它只是安装在系统上不同目录中的一部分功能.

实际上,它附带了两个相同的JRE,一个安装在JDK安装目录中,另一个安装在JDK安装目录之外.

这一直困扰着我,因为完全浪费了维护人员的努力来实现这一点,并且完全浪费了安装它的计算机上的磁盘空间,因为JRE只是复制了JDK可以做的一些事情.已经做好了

最后,在Java 11中,Oracle和OpenJDK团队决定结束这种愚蠢并只发布一个东西,即JDK.安装时这个JDK在硬盘上实际上比以前的旧JRE小,甚至删除了一些有效的参数,你需要为磁盘空间有限的设备单独使用JRE,这一论点从未解释为什么2个JRE会首先安装一个JDK,但是为了证明需要将JRE作为JDK的精简运行时环境.

因此,不需要单独的JRE,并且很长一段时间没有一个,更不用说包括并强行安装它作为JDK安装的一部分.

不,您不需要创建自己的JRE.只需在客户端计算机上安装OpenJDK,并确保将$ JAVA_HOME/bin添加到系统路径,就像使用旧JRE一样.

哦,剥去任何java*.exe文件的Windows目录树,旧的JRE安装程序的某些版本不会放在那里,以及系统路径也有一些JRE安装程序添加了一些奇怪的条目.

  • 在早期版本中,jdk可以安装在任何地方,而"public jre"必须安装在启动分区上.这纯粹是Sun发明的限制,实际上,浏览器插件或控制面板的注册并不需要这样做.后来的版本解除了限制,但仍然安装了"公共jre"作为一个单独的jre(我总是关掉这个选项).如今,这些功能已经消失,所以不必要的东西变得更加不必要了.Afaik,你仍然可以通过jlink从JDK创建一个JRE,归结为删除开发模块. (7认同)
  • 我认为JRE不再可用的实际原因是因为从Java 9(模块系统)开始,应用程序应该作为一个独立的部分提供,而不是依赖于外部可用的JRE. (6认同)
  • @Holger 好点。更奇怪的是,Sun 默认将 JRE 安装在 Windows 上的“c:\program files”下,而如果安装在名称中有空格的目录中,它将无法正常工作:) (2认同)
  • 所以......没有更多的`JRE_HOME`环境变量吗? (2认同)
  • AdoptOpenJDK 项目为 Java 11 提供 JRE 和 JDK 下载:https://adoptopenjdk.net/releases.html?variant=openjdk11#x64_win(参见@matsonkepson 的回答)。这是否更“愚蠢”? (2认同)

Bas*_*que 13

tl; dr

没有jre,我的客户将如何使用我的应用程序?

?在基于Java的应用程序中捆绑Java实现。

学习关于:

细节

我了解到Java 11正在强制将我们的应用程序模块化

不,严格来说,不需要模块化。大多数现有的应用程序都可以在Java 11中按原样运行。您可以继续在Java 11中进行开发而无需对代码进行模块化。但是对于您的情况,对于GUI桌面或移动应用程序,则需要在应用程序中打包JVM。模块化和使用jlink工具可能是实现此目的的最佳方法。相比之下,基于服务器的基于Servlet的应用程序或微服务服务器无需模块化,尽管最终可能这样做是个好主意。

我注意到Java 11没有JRE文件夹。

Oracle不再打算让最终用户安装JRE或JDK。浏览器中的Java AppletJava Web Start应用程序交付已被淘汰,最终用户不需要JRE。基于Java的应用程序应捆绑自己的Java实现。唯一有意识地安装JDK的人将是开发人员和服务器端sysadmins。

有些人对Java Everywhere梦想的逝去感到失望。而且他们可能不得不为每个主机OS(macOS,Linux,Windows等)构建其应用程序而感到恼火。另一方面,一些开发人员很乐意将Java实现(现在比以往更小)捆绑在一起,因为这消除了最终用户下载,安装,更新系统范围的Java实现的麻烦。还消除了与公司IT部门进行争斗以在用户的​​PC上安装Java的麻烦。众所周知,将Java与应用程序捆绑在一起可简化测试和支持,并确切控制涉及的Java版本和发行版。顺便说一句,这种与应用程序捆绑在一起的Java并不是全新的:Apple已在macOS和iOS应用程序商店中支持了很多年。

重要:

这是一个流程图,可以帮助您在提供Java 11实现的各种供应商之间寻找和确定。

流程图,可帮助您从各种供应商中查找和选择Java 11的实现。

  • @Pixelstix正确,除了最后一句话。一些开发人员很高兴将Java实现(现在比以往更小)与他们的应用捆绑在一起,因为这消除了最终用户下载,安装,更新系统范围的Java实现的麻烦。还消除了让企业IT部门安装Java的麻烦。众所周知,将Java与应用程序捆绑在一起可简化测试和支持,并确切控制涉及的Java版本和发行版。顺便说一句,这种与应用程序捆绑在一起的Java并不是全新的:Apple已在macOS和iOS应用程序商店中支持了很多年。 (2认同)
  • 仅当新的安全漏洞可能因您的特定功能而影响您的特定客户时,您才需要使用新版本更新您的应用。如果您的应用程序不使用 TLS,则无需针对 TLS 错误进行更新。这适用于您可能作为应用程序依赖项包含的任何库。JVM 现在是您的应用程序中的一个(大)依赖项。您的应用程序中的 JVM 仅供您的应用程序使用。 (2认同)
  • @Pixelstix 我们同意。这当然是从 Java 作为平台到 Java 作为运行时的转变。是的,有一些权衡,有一些好处也有一些缺点。 (2认同)

mat*_*son 8

查看AdoptOpenJDK项目网站以下载最新的JRE和JDK https://github.com/AdoptOpenJDK/openjdk-jdk11

我已经使用他们的夜间构建来解决JDK包https://adoptopenjdk.net/releases.html?variant=openjdk11#x64_linux中缺少JRE的问题

只需将JRE解压缩到JDK文件夹中就可以了。

在此处输入图片说明