{"id":6090,"date":"2021-09-28T14:31:20","date_gmt":"2021-09-28T14:31:20","guid":{"rendered":"https:\/\/thorsten.qodeinteractive.com\/?p=6090"},"modified":"2022-04-13T01:51:21","modified_gmt":"2022-04-13T01:51:21","slug":"the-great-innovators","status":"publish","type":"post","link":"https:\/\/proskillsglobal.com\/ar\/the-great-innovators\/","title":{"rendered":"\u062a\u062a\u0631\u0627\u0648\u062d JEPs \u0627\u0644\u0645\u0642\u062f\u0645\u0629 \u0641\u064a Java 17 \u0645\u0646 \u0645\u064a\u0632\u0627\u062a \u0627\u0644\u0644\u063a\u0629 \u0627\u0644\u062c\u062f\u064a\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u062a\u062d\u0633\u064a\u0646\u0627\u062a \u0644\u0644\u0645\u0643\u062a\u0628\u0627\u062a \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 \u0648\u0627\u0644\u0645\u0639\u0627\u064a\u0646\u0627\u062a \u0648\u0627\u0644\u062d\u0627\u0636\u0646\u0627\u062a."},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"6090\" class=\"elementor elementor-6090\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4334ad5 elementor-section-boxed elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"4334ad5\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7a10102\" data-id=\"7a10102\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f1c6ad9 elementor-widget elementor-widget-text-editor\" data-id=\"f1c6ad9\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.15.0 - 20-08-2023 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p>There\u2019s something in Java 17 for everyone. Want new language features? Check out sealed classes and the preview of pattern matching for\u00a0<code>switch<\/code>. Looking for stronger security? JDK 17 delivers context-specific deserialization filters. Care about new platforms? There\u2019s now a version of the JDK for 64-bit Macs with the ARM AArch64 architecture. How about years of stability? Java SE 17 is a Long-Term Support (LTS) release, just like Java 11 and Java 8.<\/p><p>Officially, Java 17\u2019s birthday (that is, when it\u2019s generally available) is September 14, 2021, but its 14 JEPs have been visible, of course, for months. Developers have been playing with the source code and running the binaries, and many have contributed back comments, bug reports, and suggestions.<\/p><p>For the technical details on Java 17 and each of its JEPs, see the following resources:<\/p><ul class=\"obullets\"><li><a href=\"https:\/\/blogs.oracle.com\/java\/post\/announcing-java17\" target=\"_blank\" rel=\"noopener\">The official Java blog post: The arrival of Java 17<\/a><\/li><li><a href=\"https:\/\/www.oracle.com\/news\/announcement\/oracle-releases-java-17-2021-09-14\/\" target=\"_blank\" rel=\"noopener\">The official Oracle press release<\/a><\/li><li><a href=\"https:\/\/openjdk.java.net\/projects\/jdk\/17\/\" target=\"_blank\" rel=\"noopener\">The JDK 17 resource page, which links to the JEPs<\/a><\/li><li><a href=\"https:\/\/jdk.java.net\/17\/release-notes\" target=\"_blank\" rel=\"noopener\">The JDK 17 release notes<\/a><\/li><li><a href=\"https:\/\/openjdk.java.net\/projects\/jdk\/17\/spec\/\" target=\"_blank\" rel=\"noopener\">Java SE 17 platform (JSR 392)<\/a><\/li><li><a href=\"https:\/\/cr.openjdk.java.net\/~iris\/se\/17\/latestSpec\/java-se-17-jls-fr-diffs.pdf\" target=\"_blank\" rel=\"noopener\"><em>The Java Language Specification<\/em>, Java SE 17 edition<\/a><\/li><li><a href=\"https:\/\/cr.openjdk.java.net\/~iris\/se\/17\/latestSpec\/java-se-17-jvms-fr-diffs.pdf\" target=\"_blank\" rel=\"noopener\"><em>The Java Virtual Machine Specification<\/em>, Java SE 17 edition<\/a><\/li><li><a href=\"https:\/\/cr.openjdk.java.net\/~iris\/se\/17\/latestSpec\/\/api\/index.html\" target=\"_blank\" rel=\"noopener\">Java 17 API specification<\/a><\/li><li><a href=\"https:\/\/cr.openjdk.java.net\/~iris\/se\/17\/latestSpec\/apidiffs\/overview-summary.html\" target=\"_blank\" rel=\"noopener\">API differences between Java SE 16 and Java SE 17<\/a><\/li><\/ul><p>Java 17 is also an LTS release, which means you can deploy it knowing that it will be maintained through patches, fixes, and performance enhancements for many years. You can see more about that in Donald Smith\u2019s article\u00a0\u201c<a href=\"https:\/\/blogs.oracle.com\/javamagazine\/post\/java-long-term-support-lts\" target=\"_blank\" rel=\"noopener\">The art of long-term support and what LTS means for the Java ecosystem<\/a>.\u201d<\/p><p>Below, I explore four of the JEPs that are probably most relevant for application-developing programmers and architects who are considering a migration from either Java 16 or Java 11\u2014and I will discuss other evolutionary features as well.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1cc7b2 elementor-widget elementor-widget-text-editor\" data-id=\"c1cc7b2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1203a88 elementor-section-boxed elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"1203a88\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c933f6c\" data-id=\"c933f6c\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1a517a5 elementor-widget elementor-widget-text-editor\" data-id=\"1a517a5\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2>Language feature: Sealed classes (JEP 409)<\/h2><p>Sealed classes might be the most eagerly anticipated finalized feature in JDK 17, and they were previewed in JDK 16. In short, sealed classes restrict which other classes (or interfaces) may extend them. As\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/409\" target=\"_blank\" rel=\"noopener\">JEP 409<\/a>\u00a0describes, a sealed class or interface can be extended or implemented only by those classes and interfaces permitted to do so. A class is sealed by applying the\u00a0<code>sealed<\/code>\u00a0modifier to its declaration. Then, after any\u00a0<code>extends<\/code>\u00a0\u0648\u00a0<code>implements<\/code>\u00a0clauses, the\u00a0<code>permits<\/code>\u00a0clause specifies the classes that are permitted to extend the sealed class. If those classes are not expressly permitted to make changes, they can\u2019t make changes.<\/p><p>Why should you care? According to Aurelio Garcia-Ribeyro, director of product management for Java SE, \u201cSealed classes allow me to create a set of options that I know is finite\u2014and that simplifies code because then I can treat classes as if they were enums.\u201d<\/p><p>Having sealed classes, he says, eliminates the concern that some other code can override your code or modify its behavior in ways you can\u2019t anticipate. \u201cIt creates a guarantee that nobody can enhance a library in a way that will break my code in the future.\u201d<\/p><h2>Core library upgrade: Context-specific deserialization filters (JEP 415)<\/h2><p>Context-specific deserialization filters build on a feature introduced in Java 9 (see\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/290\" target=\"_blank\" rel=\"noopener\">JEP 290: Filter incoming serialization data<\/a>). That old JEP offered both changeable per-stream deserialization filters and a static JVM-wide filter. The per-stream filters, unfortunately, did not scale well, and it\u2019s difficult to update filters after code has been shipped. JEP 290\u2019s filters also cannot impose filtering on deserialization operations performed by third-party libraries in an application. The JVM-wide filter was limited in that it was specified only once, at startup, and was sometimes too inclusive or too restrictive.<\/p><p>The new functionality\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/415\" target=\"_blank\" rel=\"noopener\">in JEP 415<\/a>\u00a0is presented as a JVM-wide filter factory. The filters are dynamic and context-specific. For backward compatibility, if a filter factory is not set, the built-in factory returns a static JVM-wide filter if one was configured.<\/p><p>The problem, says Garcia-Ribeyro, is that every time a developer created a pipeline, the developer had to define what the filter was, including an allowlist and a denylist. However, according to Garcia-Ribeyro, \u201cIf I\u2019m using a third-party library, they are using their own streams. I could define a JVM-wide filter, but I had to know\u2014ahead of time\u2014everything that the library wanted to do. This required a lot of work.\u201d<\/p><p>By contrast, JEP 415 provides a filter factory. \u201cWith a filter factory, deserialization filters are now immensely\u00a0easier to use,\u201d he says, \u201cto the point that this is the one feature that we are already reworking and retrofitting, all the way to JDK 11 and JDK 8.\u201d<\/p><p>There\u2019s no time frame set for rolling JEP 415 back to the older version of Java, but Garcia-Ribeyro insists, \u201cWe\u2019re furiously working on it.\u201d<\/p><h2>Core library update: New macOS rendering pipeline (JEP 382)<\/h2><p>Do you use a Mac? I do\u2014I don\u2019t know what I\u2019d do without my quad-core i7-based MacBook Pro. The new macOS rendering pipeline described by\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/382\" target=\"_blank\" rel=\"noopener\">JEP 382<\/a>\u00a0is pretty simple: It moves the JVM\u2019s 2D graphics away from using the deprecated Apple OpenGL API to the newer\u00a0<a href=\"https:\/\/developer.apple.com\/metal\/\" target=\"_blank\" rel=\"noopener\">Apple Metal API<\/a>. Of course, if you\u2019re using Java for back-end workloads, you likely won\u2019t care about this.<\/p><p><a href=\"https:\/\/developer.apple.com\/documentation\/macos-release-notes\/macos-mojave-10_14-release-notes?preferredLanguage=occ#3035786\" target=\"_blank\" rel=\"noopener\">Apple started phasing out OpenGL in macOS Mojave 10.14<\/a>, advising, \u201cThe APIs in the OpenGL and OpenCL frameworks are deprecated and remain present for compatibility purposes. Transition to Metal if your app is using OpenGL or OpenCL.\u201d<\/p><p>This change applies to both Intel- and ARM-based Macs. This is a hidden change. As the JEP 382 documentation says, \u201cThe changes are confined to macOS-specific code and even there only a minimal amount of code shared between Metal and OpenGL is updated. We did not introduce any new Java APIs, nor did we change any existing API.\u201d<\/p><p>The JEP 382 documentation further notes, \u201cApple claims that the Metal framework, their replacement for OpenGL, has superior performance. For the Java 2D API, this is generally the case with some exceptions.\u201d<\/p><p>For now, the Java 17 JVM will default to using OpenGL; it\u2019ll use Metal only if OpenGL is not present or if the user throws a command-line switch. Garcia-Ribeyro asks, however, for Mac users to try the new code. \u201cWe want you to turn on this new rendering pipeline. It should be faster than, or at least the same as, the existing graphics performance on Macs.\u201d<\/p><h2>Preview: Pattern matching for switch (JEP 406)<\/h2><p>I\u2019ve probably heard more about\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/406\" target=\"_blank\" rel=\"noopener\">pattern matching for\u00a0<code>switch<\/code>\u00a0(JEP 406)<\/a>\u00a0than any other JDK 17 feature\u2014and Garcia-Ribeyro is excited about it too. \u201cThis feature makes Java better for everyone,\u201d he says, \u201cand a couple of releases down the line, it will become part of the Java standard.\u201d<\/p><p>This JEP builds on the work in\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/394\" target=\"_blank\" rel=\"noopener\">pattern matching for\u00a0<code>instanceof<\/code>\u00a0(JEP 394)<\/a>, which was finalized for JDK 16. The new feature offers two big benefits.<\/p><ul class=\"obullets\"><li>It makes\u00a0<code>switch<\/code>\u00a0statements far more programmable and flexible by allowing patterns to appear in\u00a0<code>case<\/code>\u00a0labels. To quote the JEP documentation, \u201cYou can only\u00a0<code>switch<\/code>\u00a0on values of a few types \u2014 numeric types, enum types, and\u00a0<code>String<\/code>\u00a0\u2014 and you can only test for exact equality against constants. We might like to use patterns to test the same variable against a number of possibilities, taking a specific action on each, but since the existing\u00a0<code>switch<\/code>\u00a0does not support that, we end up with a chain of\u00a0<code>if...else<\/code>\u00a0tests.\u201d<\/li><li>It provides a more graceful (and developer-friendly) mechanism for handling null conditions. Again, to quote: \u201cTraditionally,\u00a0<code>switch<\/code>\u00a0statements and expressions throw\u00a0<code>NullPointerException<\/code>\u00a0if the selector expression evaluates to null, so testing for null must be done outside of the switch\u2026This was reasonable when\u00a0<code>switch<\/code>\u00a0supported only a few reference types. However, if\u00a0<code>switch<\/code>\u00a0allows a selector expression of any type, and case labels can have type patterns, then the standalone null test feels like an arbitrary distinction, and invites needless boilerplate and opportunity for error.\u201d<\/li><\/ul><p>I expect most developers will find that when they try pattern matching for\u00a0<code>switch<\/code>, they\u2019ll say, \u201cWhere have you been all my life?\u201d<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-241583c elementor-section-boxed elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"241583c\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-127bea7\" data-id=\"127bea7\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d22572f elementor-widget__width-initial elementor-widget elementor-widget-thorsten_core_single_image\" data-id=\"d22572f\" data-element_type=\"widget\" data-widget_type=\"thorsten_core_single_image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-single-image qodef-layout--default  qodef-si-main-appear-animation--no qodef-si-additional-appear-animation--no qodef-appear-animation--left\">\n\t<div class=\"qodef-m-image\">\n\t\t\t<img width=\"800\" height=\"883\" src=\"https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-1.jpg\" class=\"attachment-full size-full\" alt=\"d\" decoding=\"async\" srcset=\"https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-1.jpg 800w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-1-600x662.jpg 600w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-1-272x300.jpg 272w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-1-768x848.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t<\/div>\n\t<\/div>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-b88d971\" data-id=\"b88d971\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-391f62a elementor-widget__width-initial elementor-widget elementor-widget-thorsten_core_single_image\" data-id=\"391f62a\" data-element_type=\"widget\" data-widget_type=\"thorsten_core_single_image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-single-image qodef-layout--default  qodef-si-main-appear-animation--no qodef-si-additional-appear-animation--no qodef-appear-animation--left\">\n\t<div class=\"qodef-m-image\">\n\t\t\t<img width=\"800\" height=\"883\" src=\"https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-2.jpg\" class=\"attachment-full size-full\" alt=\"d\" decoding=\"async\" srcset=\"https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-2.jpg 800w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-2-600x662.jpg 600w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-2-272x300.jpg 272w, https:\/\/proskillsglobal.com\/wp-content\/uploads\/2021\/05\/blog-single-img-2-768x848.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t<\/div>\n\t<\/div>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6b5ba9f elementor-section-boxed elementor-section-height-default elementor-section-height-default qodef-elementor-content-no\" data-id=\"6b5ba9f\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f69b92a\" data-id=\"f69b92a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f9e5338 elementor-widget elementor-widget-text-editor\" data-id=\"f9e5338\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2>Other new stuff in Java 17<\/h2><p>There is a veritable cornucopia of new functionality in Java 17. Here are a few items worth investigating.<\/p><ul class=\"obullets\"><li>The foreign function and memory API, which helps invoke code and access \u201cforeign\u201d resources outside the JVM, is now being incubated. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/412\" target=\"_blank\" rel=\"noopener\">JEP 412<\/a>.)<\/li><li>Java now has better pseudo-random number generators. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/356\" target=\"_blank\" rel=\"noopener\">JEP 356<\/a>.)<\/li><li>Java has new utilities for working with hexadecimal values. (See\u00a0<a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8251989\" target=\"_blank\" rel=\"noopener\">JDK-8251989<\/a>.)<\/li><li>The default for security handshakes in JDK 17 is TLS 1.3; previous versions of Java used TLS 1.2. (See\u00a0<a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8217633\" target=\"_blank\" rel=\"noopener\">JDK-8217633<\/a>.)<\/li><li>There\u2019s a Java port to macOS on AArm64 architecture. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/391\" target=\"_blank\" rel=\"noopener\">JEP 391<\/a>.)<\/li><\/ul><p>There are deprecations and removals, too, including the following:<\/p><ul class=\"obullets\"><li>External access to Java internals has been removed through encapsulation, with a few exceptions such as\u00a0<code>sun.misc.Unsafe<\/code>. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/403\" target=\"_blank\" rel=\"noopener\">JEP 403<\/a>.)<\/li><li>The AOT and JIT compilers have been removed from the HotSpot JVM. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/410\" target=\"_blank\" rel=\"noopener\">JEP 410<\/a>.)<\/li><li>The Applet API is deprecated for removal. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/398\" target=\"_blank\" rel=\"noopener\">JEP 398<\/a>.)<\/li><li>The Security Manager is deprecated for removal. (See\u00a0<a href=\"https:\/\/openjdk.java.net\/jeps\/411\" target=\"_blank\" rel=\"noopener\">JEP 411<\/a>.)<\/li><li>The weak 3DES and RC4 security algorithms in Kerberos are deprecated. (See\u00a0<a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8139348\" target=\"_blank\" rel=\"noopener\">JDK-8139348<\/a>.)<\/li><li>The Socket Implementation Factory Mechanism is deprecated. (See\u00a0<a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8235139\" target=\"_blank\" rel=\"noopener\">JDK-8235139<\/a>.)<\/li><\/ul><p>Finally, there\u2019s a new way to download the current revision of Java 17 via a static link. In the past, each incremental dot-release version of a JDK had its own URL, which made it hard to programmatically include the latest dot-release in a build script.<\/p><p>\u201cWe will now give you a permanent URL, so you can write a script that says, \u2018go get the latest version of JDK 17,\u2019\u201d explains Garcia-Ribeyro. \u201cWe will even have a sample Docker file that will ensure that whenever you build, it will grab the latest version of JDK 17 for you.\u201d<\/p><h2>\u062e\u0627\u062a\u0645\u0629<\/h2><p>You can\u2019t judge a book by its cover, and you can\u2019t judge a Java version by counting its JEPs. The changes in Java 17 are significant compared to Java 16 and, as an LTS release, the Java 17 platform shows significant evolution from Java 11 or Java 8. With added language features, runtime enhancements, previews and incubators, and literally thousands of smaller fixes, Java 17 is ready to be the new Java platform standard.<\/p><h2>Dig deeper<\/h2><ul class=\"obullets\"><li><a class=\"o-hf\" href=\"https:\/\/blogs.oracle.com\/javamagazine\/post\/java-long-term-support-lts\" target=\"_blank\" rel=\"noopener\">The art of long-term support and what LTS means for the Java ecosystem<\/a><\/li><li><a href=\"https:\/\/blogs.oracle.com\/javamagazine\/hidden-gems-jdk16-jdk17-jep\" target=\"_blank\" rel=\"noopener\">The hidden gems in Java 16 and Java 17<\/a><\/li><li><a href=\"https:\/\/blogs.oracle.com\/javamagazine\/java-architects-loom-panama-valhalla\" target=\"_blank\" rel=\"noopener\">What are they building\u2014and why? 6 questions for the Java architects<\/a><\/li><li><a href=\"https:\/\/blogs.oracle.com\/javamagazine\/inside-the-language-sealed-types\" target=\"_blank\" rel=\"noopener\">Inside the language: Sealed types<\/a><\/li><li><a href=\"https:\/\/blogs.oracle.com\/javamagazine\/java-hotspot-jvm-switches-jdk11-jdk17\" target=\"_blank\" rel=\"noopener\">The best HotSpot JVM options and switches for Java 11 through Java 17<\/a><\/li><li><a href=\"https:\/\/blogs.oracle.com\/javamagazine\/java-runtime-encapsulation-internals\" target=\"_blank\" rel=\"noopener\">A peek into Java 17: Encapsulating the Java runtime internals<\/a><\/li><\/ul><p>\u00a0<\/p><p>Source: https:\/\/blogs.oracle.com\/post\/java-jdk-17-generally-available-v2<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Lorem ipsum dolor sit amet\u060c sea ei Diam ocurreret. Atqui clita eu eos\u060c in interesset mediocritatem \u0627\u0644\u062c\u0644\u0648\u0633. Saperet commune Invenire at per\u060c ne consul eirmod scaevola ius\u060c case scripta id vis. \u0625\u0639\u0644\u0627\u0646 \u0646\u0627\u0626\u0628 \u0627\u0644\u0631\u0626\u064a\u0633 \u0645\u0627\u062c\u0646\u0627 \u062f\u064a\u0644\u0646\u064a\u062a\u064a. Nihil antiopam et mei \u060c \u0623\u062d\u062f \u0623\u0637\u0628\u0627\u0642 \u0627\u0644\u0628\u062d\u0631 mnesarchum \u060c sea ne soluta appetere tacimates. Ad soluta ignota corrumpit eos. \u0644\u062f\u064a\u0647\u0627 patrioque delicatissimi ut\u060c per veritus alienum te\u060c nec choro soluta fabulas in. Quod sensibus est id<\/p>","protected":false},"author":1,"featured_media":17013,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[22],"_links":{"self":[{"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/posts\/6090"}],"collection":[{"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/comments?post=6090"}],"version-history":[{"count":5,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/posts\/6090\/revisions"}],"predecessor-version":[{"id":17014,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/posts\/6090\/revisions\/17014"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/media\/17013"}],"wp:attachment":[{"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/media?parent=6090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/categories?post=6090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/proskillsglobal.com\/ar\/wp-json\/wp\/v2\/tags?post=6090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}