Java 9 的向后兼容性

每当新版本的Java发布时,都会有很多关于新的语言特性,API,以及新版本优势的激动人心的讨论。但是,当传统开发人员想到,他们必须维护和增强现有的应用程序,而不是创建新的应用程序时,兴奋就会快速消失。大多数应用程序必须向后兼容早期版本的Java,它不支持新Java版本提供的闪亮新特性。所以,传统开发人员选择放弃,并坐在旁边观看。

幸运的是,Java 9的设计人员早已意识到这一点,并且已经设法使Java 9的新功能也适用于那些不得不担心支持旧版本Java的应用程序的开发人员。在这里,我们将讨论Java 9 – 多版本JAR文件,Project Jigsaw(新模块系统)以及模块化JDK和jlink中的新功能。

多版本JAR文件

直到最近,还没有一个很好的方法来使用最新的Java特性,同时仍然允许应用程序在不支持该应用程序的早期版本的Java上运行。 Java 9终于提供了一种新的API和新的Java语言结构的方法:多版本
JAR文件。

多版本JAR文件看起来就像传统的JAR文件,但有一重要改进:在JAR文件中有一个新的角落,你可以在其中放置使用最新Java 9特性的类。如果你运行Java 9,则JVM会识别此角落,使用该角落中的类,并忽略任何在JAR文件的常规部分中具有相同名称的类。但是,如果你在使用Java 8或更早版本,则JVM不知道此特殊的角落并将忽略它,并且仅在JAR文件的常规部分运行类。将来,当Java 10出来时,会有另一个角落专门针对使用新的Java 10特性的类,等等。

Java 9 JDK将包含支持创建多版本JAR文件的jar.exe工具的版本。其他非JDK工具也将提供支持。

Jigsaw项目

Java 9模块系统(也称为项目拼图)无疑是对Java 9的最大的改变。模块化的一个目标是加强Java的封装机制,以便开发人员可以指定哪些API暴露给其他组件并依赖于JVM强制封装。模块化的封装性比public/protected/private类和类成员的访问控制修饰符提供的封装机制更强。模块化的第二个目标是指定哪些模块需要哪些其他模块,并确保在应用程序执行之前存在所有必需的模块。在这个意义上说,模块比传统的类路径机制更强大,因为类路径没有提前检查,而由于缺少类的错误只有在实际需要这些类时才发生,这意味着只有在应用程序运行很长时间,或者运行了很多次之后,才会发现不正确的类路径的问题。

Java 9提供类路径和模块路径。类路径与以前一样工作,你可以继续使用它。模块路径中的JAR文件被解释为模块 – 它们公开API并具有可在编译时检查的依赖关系。如果你想要额外控制,你可以通过添加指定哪些API暴露的信息以及其他哪些API模块是必需的。但是,即使没有,如果你的JAR文件位于模块路径中,那么它被认为是一个自动模块,尽管它缺少一些可以用来检查是否有任何东西丢失的信息。此外,类路径中的所有JAR文件都被认为是未命名模块的一部分,这也意味着它们也成为模块系统的一部分。这意味着你的JAR文件是模块化的还是传统的JAR真的没关系。甚至还可能因为Jar文件不属于你的,而无法模块化。所有模块在模块系统中运行,无论它们是否是最新的,以及无论他们在类路径还是模块路径中。如果你将JAR文件模块化并将它们放在模块路径中,你将获得额外的好处,并避免潜在的错误。但即使没有,你也可以获得模块系统的许多好处。这一切可能听起来很复杂,但就这么简单可行。

如何使用模块化JDK和jlink提供你自己的Java环境

传统Java应用程序的一个问题是最终用户可能没有使用正确的Java环境,并且确保Java应用程序运行的一种方法是为应用程序提供Java环境。Java允许创建可以与程序一起发布的私有或可再发行JRE。 JDK / JRE安装附带有关如何创建私有JRE的说明。通常,你将使用与JDK一起安装的JRE文件层次结构,保留所需的文件,并保留应用程序需要的功能的可选文件。该过程有点麻烦:你需要维护安装文件层次结构,你必须小心,不要遗漏任何可能需要的文件和目录。你不想留着任何你不需要的东西,因为它将占用不必要的空间。这过程很容易犯错误。那么为什么不让JDK为你做这件事呢?

使用Java 9,现在可以使用应用程序和需要运行的任何内容创建一个独立的环境。无需担心用户机器上的Java环境不正确,不用担心你不正确地创建了私有JRE。

创建这些独立运行时映像的关键是模块系统。你不仅可以模块化自己的代码(或不),而且Java 9 JDK本身现在也是模块化的。 Java类库现在是模块的集合,JDK本身的工具也是这样。模块系统要求你指定代码所需的基本类模块,这反过来将指定所需的JDK部分。为了把它放在一起,我们使用一个名为jlink的新的Java 9工具。当你运行jlink时,你将获得一个运行应用程序所需的文件层次结构 – 不再多,也不少。它会比标准的JRE小得多。

使用jlink,您可以轻松地打包应用程序以及运行所需的一切,而不用担心错误的运行,并且仅打包运行应用程序所必需的运行时部分。这样,你的传统Java应用程序有了保证可运行的环境。

有了这个新发现的知识,很显然,传统开发人员不需要坐视不理,观看其他人都可以使用新的Java 9特性。使用这些方法,任何人都可以利用所有Java 9提供的优势,而不会破坏与早期版本的Java的兼容性。

发表评论