java 9 及更高版本引入此模块系统后是否仍然与平台无关?
is java 9 and above still platform independent or not after this module system has been introduced?
在我们的java语言中引入模块系统后,我无法理解。 java9 及更高版本是否仍然独立于平台?我问这个问题是因为我读到现在每个应用程序都将在其中拥有自己的 jre。那么,这个单一的 jre 运行 如何在所有 OS,如 windows,Linux,或 Mac OS.
您将 最近对 Java 平台所做的两项不同更改 混为一谈:
- 停用 Java Web Start 和 Applet 技术
- 模块化
停用桌面技术
最近 Oracle 宣布在 Java 9 发行说明中逐步淘汰 Java Web Start technologies, in addition to the already-deprecated Applet technology. See item JDK-8184998:
Java Deployment Technologies are deprecated and will be removed in a future release
Java Applet and WebStart functionality, including the Applet API, The Java plug-in, the Java Applet Viewer, JNLP and Java Web Start including the javaws tool are all deprecated in JDK 9 and will be removed in a future release.
不再鼓励最终用户在他们的计算机上安装 JDK 或 JRE。
有关更多详细信息,请参阅来自 Oracle 的八页 2018-03 白皮书,Java Client Roadmap Update。
那么,Swing or JavaFX 应用程序的开发人员如何将他们的软件交付给最终用户?
Oracle 建议将您的应用程序与 JVM & JRE for delivery as a single launch-ready applications on that appears on the client to be just another app alongside the native apps. Such “double-clickable” app-packaging has been commonly done on the Mac since the beginning of Java. But what was once an obscure art on other host environments (Linux, BSD, Windows 等一起打包)现在将成为常态,就像在 macOS.
上一样
在过去,将 Java 运行时与您的应用程序捆绑在一起需要跳过一些 licensing hurdles. The legalities have eased with arrival of the open-source OpenJDK 项目,并且可能需要跳过其他实现†.
您需要为每个托管环境准备不同版本的应用。虽然您的 Java 代码独立于主机 OS 运行,但 JVM 是由本机代码构建的,可以与一种特定类型的主机进行交互。因此,您将需要构建一个带有 Linux JVM 的 Linux 版本,一个带有 macOS JVM 的 macOS 版本,等等。虽然这看起来令人沮丧,但好处是您不再需要担心用户安装了错误的 JVM 版本,或者根本没有安装 JVM。现在 JVM 的存在和版本都在你的控制之下。您的最终用户和客户将不再需要知道您的应用是基于 Java 的。
模块化
对应用程序打包的需求与 modularization of Java 无关。正如我所说,它已经在 Mac.
上完成了几十年
模块化给聚会带来的好处是,您捆绑到交付的应用程序中的 JVM/JRE 可以自定义为仅包含您的特定应用程序实际使用的 Java 模块。这会导致尺寸更小,因此您完成的应用程序更小,下载速度更快,使用的存储空间更少,并且您的应用程序加载速度可能更快。
开源jlink “Java Linker” tool helps with the packaging work, so you can assemble and optimize a set of modules and their dependencies (only the ones actually called by your app) into a custom run-time image. This modular run-time image format is defined in JEP 220.
† 在相关说明中,您可能需要阅读白皮书 Java Is Still Free 以了解如何以及在何处为您的应用程序,以及在免费或付费版本中可能会或可能不会提供哪些支持。
顺便说一句,您可能会发现有用的 this Answer on a related Question,其中包含选择 Java 实现的各种来源的流程图。
模块系统一般不会影响java的OS独立性。 Java 使用模块系统 的应用程序需要在 JRE 中 运行。这可以是像往常一样 OS 特定的预安装 JRE,也可以是使用 JLink.
创建的定制 运行time 映像(应用程序嵌入 JRE)
模块系统的主要目的是为您提供一种管理方式,将您的应用程序拆分为不同的逻辑模块。例如。放入不同的 .jar 文件中,这些文件可以在 运行 时加载 - 无论在哪个操作系统上。
总之,您有以下选择:
确保您的客户端预装了正确的 JRE。这可能很危险,因为(通常)您无法控制他的更新行为。
将您的应用程序与官方 JRE 一起发布。
使用JLink定制您自己的应用程序和OS特定运行时间图像].将其与您的应用程序捆绑在一起发送。
But, suppose I do not know what OS my client would be running so how
the server will decide what image he should give to him. i.e., a Mac
Image, a Linux Image or a Windows exe.
你必须了解目标 OS 并提供正确的 运行 时间图像。
Is java9 and above still platform independent or not ?
是的。它一如既往地独立于平台。模块系统与平台无关。
now every application will have its own jre inside it.
它不是必须的,但随着时间的推移,越来越多的人推荐它,因为 越来越少的人在他们的系统上单独安装 Java。 这个 曾经是,但这个数字在过去十年左右一直在下降,现在(除了 Java 开发人员)几乎没有人安装独立的 JRE。
how will this single jre run on all OS
不会。您将为要为其分发的每个平台捆绑一个单独的 JRE。但是适用于所有平台的 JRE 仍然可以免费获得,并且相同的 Java 代码仍将 运行 在适用于任何平台的 JRE 上。
虽然 Java 9 可以更轻松地发布更紧凑且特定于单个应用程序需求的 JRE,但您并非必须这样做。如果您已经计划将 JRE 与您的应用程序一起发布,那么 Java 9 可以比早期版本更小。
这并不意味着您必须发布 JRE,未随 JRE 发布的应用程序现在不太可能开始发布 JRE,事实上 Java 11 仅作为 JDK。
JLink allows you to create custom runtime images that only consist of your application modules and those JRE modules that your application requires. The result is likely a smaller runtime image, which uses fewer resources than a default JRE.
在我们的java语言中引入模块系统后,我无法理解。 java9 及更高版本是否仍然独立于平台?我问这个问题是因为我读到现在每个应用程序都将在其中拥有自己的 jre。那么,这个单一的 jre 运行 如何在所有 OS,如 windows,Linux,或 Mac OS.
您将 最近对 Java 平台所做的两项不同更改 混为一谈:
- 停用 Java Web Start 和 Applet 技术
- 模块化
停用桌面技术
最近 Oracle 宣布在 Java 9 发行说明中逐步淘汰 Java Web Start technologies, in addition to the already-deprecated Applet technology. See item JDK-8184998:
Java Deployment Technologies are deprecated and will be removed in a future release
Java Applet and WebStart functionality, including the Applet API, The Java plug-in, the Java Applet Viewer, JNLP and Java Web Start including the javaws tool are all deprecated in JDK 9 and will be removed in a future release.
不再鼓励最终用户在他们的计算机上安装 JDK 或 JRE。
有关更多详细信息,请参阅来自 Oracle 的八页 2018-03 白皮书,Java Client Roadmap Update。
那么,Swing or JavaFX 应用程序的开发人员如何将他们的软件交付给最终用户?
Oracle 建议将您的应用程序与 JVM & JRE for delivery as a single launch-ready applications on that appears on the client to be just another app alongside the native apps. Such “double-clickable” app-packaging has been commonly done on the Mac since the beginning of Java. But what was once an obscure art on other host environments (Linux, BSD, Windows 等一起打包)现在将成为常态,就像在 macOS.
上一样在过去,将 Java 运行时与您的应用程序捆绑在一起需要跳过一些 licensing hurdles. The legalities have eased with arrival of the open-source OpenJDK 项目,并且可能需要跳过其他实现†.
您需要为每个托管环境准备不同版本的应用。虽然您的 Java 代码独立于主机 OS 运行,但 JVM 是由本机代码构建的,可以与一种特定类型的主机进行交互。因此,您将需要构建一个带有 Linux JVM 的 Linux 版本,一个带有 macOS JVM 的 macOS 版本,等等。虽然这看起来令人沮丧,但好处是您不再需要担心用户安装了错误的 JVM 版本,或者根本没有安装 JVM。现在 JVM 的存在和版本都在你的控制之下。您的最终用户和客户将不再需要知道您的应用是基于 Java 的。
模块化
对应用程序打包的需求与 modularization of Java 无关。正如我所说,它已经在 Mac.
上完成了几十年模块化给聚会带来的好处是,您捆绑到交付的应用程序中的 JVM/JRE 可以自定义为仅包含您的特定应用程序实际使用的 Java 模块。这会导致尺寸更小,因此您完成的应用程序更小,下载速度更快,使用的存储空间更少,并且您的应用程序加载速度可能更快。
开源jlink “Java Linker” tool helps with the packaging work, so you can assemble and optimize a set of modules and their dependencies (only the ones actually called by your app) into a custom run-time image. This modular run-time image format is defined in JEP 220.
† 在相关说明中,您可能需要阅读白皮书 Java Is Still Free 以了解如何以及在何处为您的应用程序,以及在免费或付费版本中可能会或可能不会提供哪些支持。
顺便说一句,您可能会发现有用的 this Answer on a related Question,其中包含选择 Java 实现的各种来源的流程图。
模块系统一般不会影响java的OS独立性。 Java 使用模块系统 的应用程序需要在 JRE 中 运行。这可以是像往常一样 OS 特定的预安装 JRE,也可以是使用 JLink.
创建的定制 运行time 映像(应用程序嵌入 JRE)模块系统的主要目的是为您提供一种管理方式,将您的应用程序拆分为不同的逻辑模块。例如。放入不同的 .jar 文件中,这些文件可以在 运行 时加载 - 无论在哪个操作系统上。
总之,您有以下选择:
确保您的客户端预装了正确的 JRE。这可能很危险,因为(通常)您无法控制他的更新行为。
将您的应用程序与官方 JRE 一起发布。
使用JLink定制您自己的应用程序和OS特定运行时间图像].将其与您的应用程序捆绑在一起发送。
But, suppose I do not know what OS my client would be running so how the server will decide what image he should give to him. i.e., a Mac Image, a Linux Image or a Windows exe.
你必须了解目标 OS 并提供正确的 运行 时间图像。
Is java9 and above still platform independent or not ?
是的。它一如既往地独立于平台。模块系统与平台无关。
now every application will have its own jre inside it.
它不是必须的,但随着时间的推移,越来越多的人推荐它,因为 越来越少的人在他们的系统上单独安装 Java。 这个 曾经是,但这个数字在过去十年左右一直在下降,现在(除了 Java 开发人员)几乎没有人安装独立的 JRE。
how will this single jre run on all OS
不会。您将为要为其分发的每个平台捆绑一个单独的 JRE。但是适用于所有平台的 JRE 仍然可以免费获得,并且相同的 Java 代码仍将 运行 在适用于任何平台的 JRE 上。
虽然 Java 9 可以更轻松地发布更紧凑且特定于单个应用程序需求的 JRE,但您并非必须这样做。如果您已经计划将 JRE 与您的应用程序一起发布,那么 Java 9 可以比早期版本更小。
这并不意味着您必须发布 JRE,未随 JRE 发布的应用程序现在不太可能开始发布 JRE,事实上 Java 11 仅作为 JDK。
JLink allows you to create custom runtime images that only consist of your application modules and those JRE modules that your application requires. The result is likely a smaller runtime image, which uses fewer resources than a default JRE.