The arrival of Java 17!

原文はこちら。
The original article was written by Sharat Chander (Director, Java SE Product Management, Oracle).
https://blogs.oracle.com/java/post/announcing-java17

OracleはJDK 17の一般提供を発表いたします。このリリースは8回目のFeature Release (機能リリース)で、6ヶ月ごとのリリースサイクルで予定通りにリリースされました。このレベルの予測可能性により、期待される変更の安定した流れのおかげで、開発者はイノベーションの採用を容易にコントロールできます。

Javaは、パフォーマンス、安定性、およびセキュリティを向上させる能力を備えており、引き続き世界で最も人気のあるプログラミング言語です。IDCのレポートによると、世界中のフルタイム開発者の75%に相当する1,000万人以上の開発者がJavaを使用しており、これはプログラミング言語の中で最も多いものです。

JDK 17 is now available!

Oracleは現在、開発者、エンドユーザー、企業向けにJDK 17を提供しています。LTSリリースであるOracle JDK 17は、Oracle Java SE Support Roadmapに記載されているように、Oracle Critical Patch Update (CPU) のスケジュールに従って、少なくとも8年間、パフォーマンス、安定性、セキュリティのアップデートが提供されます。

Oracle Releases Java 17
https://www.oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/
Critical Patch Updates, Security Alerts and Bulletins
https://www.oracle.com/security-alerts/
Oracle Java SE Support Roadmap
https://www.oracle.com/java/technologies/java-se-support-roadmap.html

次の6か月ごとのリリースであるOracle JDK 18は、2022年3月に予定されています。

Java 17は、2018年に発表されたリリースケイデンスに基づく2つ目の長期サポート(LTS)バージョンです。Oracleは今後のLTSリリースの期間を3年から2年に短縮する計画を発表しています。そのため、次のLTSは2023年9月のJava 21になると予想されます。

Moving Java Forward Even Faster
https://mreinhold.org/blog/forward-even-faster
Moving the JDK to a Two Year LTS Cadence
https://blogs.oracle.com/java/post/moving-the-jdk-to-a-two-year-lts-cadence
https://logico-jp.io/2021/09/15/moving-the-jdk-to-a-two-year-lts-cadence/

Oracle JDK 17のもう一つの重要な変更点は、新しいシンプルなライセンス条項で、企業は少なくとも今後3年間、四半期ごとのパフォーマンス、安定性、およびセキュリティパッチを含むOracle JDK 17を無償で使用することができ、次のLTSリリースと丸1年オーバーラップできます。Java SE Subscriptionを契約されている方は、OracleのJava SE Supportや、GraalVM Enterprise、Java Management Service、Advanced Management Consoleなどの商用機能にアクセスできます。

Introducing the Free Java License
https://blogs.oracle.com/java/post/free-java-license
https://logico-jp.io/2021/09/15/introducing-the-free-java-license/

Java 17, Together

これまでのリリースと同様、Java 17でも、OpenJDKコミュニティの多くの個人や組織からの貢献を引き続き称えます。 — we all build Java, together!

JDK 17 Fix Ratio

JDKのリリースにおける変化の割合は何年も前からほぼ一定でしたが、6ヶ月のサイクルでは、製品化に適した機能や改良が提供されるペースが大幅に改善されました。

かつてのメジャーリリースのように数年ごとに何万もの修正や100近いJEP(JDK Enhancement Proposals)を提供するのではなく、より管理しやすく、予測可能な6カ月のスケジュールで、よりスリムなFeature Releaseで機能強化が行われます。変更点は、重要な新機能から小規模な機能強化、日常的なメンテナンス、バグ修正、ドキュメントの改善など多岐にわたります。それぞれの変更は、JDK Bug Systemの1つのissueに対する1つのコミットで表されます。

GAの時点で Java 12からJava 17において修正済みとされたJIRAのissue 12,733件のうち、9,218件はOracleに勤務する人が完了させたもので、3,515件は個人の開発者や他の組織に勤務する開発者が提供したものでした。

Java 17では、修正済みとマークされたJIRAのissue 2,645件のうち、1,774件はOracle社が、871 件はJavaコミュニティの他のメンバーが提供したものでした。issueを調べ、アサインされた人の所属組織データを照合した結果、Java 17のコントリビューションの開発をスポンサーしている組織のグラフは以下のようになりました。

Oracleは、Amazon、NTTデータ、Red Hat、SAP、Tencentなどの組織に勤務する開発者が顕著な貢献をしてくれたことに感謝します。 また、Bellsoft、DataDog、Loongson、Skymaticなどの小規模な組織や、個人開発者からの貢献にも感謝しています。個人開発者の貢献は、Java 17の修正の6%にのぼります。

また、提案された変更点を検討してくださった多くの経験豊富な開発者の方々、早期アクセス用のビルドを試して問題点を報告してくださったアーリーアダプターの方々、OpenJDKのメーリングリストでフィードバックを提供してくださった熱心な専門家の方々にも同様に感謝しています。

以下の方々は、ビルドの品質に関する貴重なフィードバックを提供し、良質なバグを記録し、頻繁にアップデートを提供してくださいました。

  • Jaikiran Pai (Apache Ant)
  • Rick Hillegas (Apache Derby)
  • Uwe Schindler (Apache Lucene)
  • Mark Thomas (Apache Tomcat)
  • Martin Grigorov (Apache Tomcat, Apache Wicket)
  • Rafael Winterhalter (Byte Buddy)
  • Yoann Rodière (Hibernate ORM, Validator, Search, Reactive)
  • Marc Hoffman (JaCoCo)
  • Lukas Eder (jOOQ)
  • Christian Stein (JUnit 5)
  • David Karnok (RxJava)

さらに、Quality Outreachプログラムを通じて、リリースの品質向上のために、Java 17早期アクセスビルドのテストに優れたフィードバックを提供してくださった以下のFOSSプロジェクトおよび個人の方々に感謝いたします。

  • Apache Aries Spi Fly
  • Apache CXF
  • Apache Zookeeper (Enrico Olivelli)
  • Aries JAX-RS
  • BurningWave
  • DataSketches
  • Eclipse Collections
  • Eo-yaml
  • FXGL
  • JabRef
  • JaCoCo (Evgeny Mandikov)
  • Java Katas (Chandra Guntur)
  • Jenkins
  • Jobrunr
  • JOOQ
  • JUnit
  • Karate
  • MyBatis (Iwao Ave)
  • Netty
  • PDFsam
  • Sedja
  • Selenide
  • Syncope
  • Vaadin

New in Java 17

何千ものパフォーマンス、安定性、セキュリティに関するアップデートに加え、Java 17では、インキュベーター・モジュールで提供される3つの機能とプレビュー言語機能1つを含む、14の機能強化/変更(JDK Enhancement Proposals – JEPs)が提供されます。

JDK 17
https://openjdk.java.net/projects/jdk/17/
JEP 1: JDK Enhancement-Proposal & Roadmap Process
https://openjdk.java.net/jeps/1

インキュベーター・モジュールでは、最終版ではないAPIや最終版ではないツールを開発者やユーザーに提供し、最終的にJavaプラットフォームの品質を向上させるためのフィードバックを集めることができます。

JEP 11: Incubator Modules
https://openjdk.java.net/jeps/11

同様にプレビュー機能は、Java SEプラットフォームの言語機能やVM機能を完全に規定し、完全に実装したものですが、まだ完成版ではありません。プレビュー機能は、JDKフィーチャー・リリースで提供され、実際の使用に基づいた開発者のフィードバックを可能にし、将来のリリースで永続的に使用されるようになります。 これにより、ツールベンダーは、Java SE標準に確定される前に機能をサポートするための作業を行うことができます。

JEP 12: Preview Features
https://openjdk.java.net/jeps/12

私たちは、Java 17で提供される14のJEPを7つのカテゴリーに分類しました。

1. Language Feature

JEP 409: Sealed Classes

Sealed classとは、APIの設計者が、あるクラスを拡張したり実装したりするクラスやインターフェースを指定できるものです。問題をモデル化する際に考慮すべきケースを網羅的にリストアップすることで、開発を簡素化できます。JEP 409は、Javaプログラミング言語の進化を通じて開発者の生産性を継続的に向上させることを目的としたOpenJDK Project Amberで開発されました。

Project Amber
https://openjdk.java.net/projects/amber/

2. Updates and Improvements on Core Libraries

JEP 306: Restore Always-Strict Floating-Point Semantics

Javaプログラミング言語とJava仮想マシンは、もともと厳密な浮動小数点セマンティクスしか持っていませんでした。JDK 1.2からは、当時のハードウェア・アーキテクチャの制限に対応するために、これらの厳密なセマンティクスの小さな差異がデフォルトで許可されていました。これらの差異はもはや有用でも必要でもなく、JEP 306によって削除されました。

JEP 356: Enhanced Pseudo-Random Number Generator

java.util.randomがアップデートされたことで、異なる PRNG (Pseudo-Random Number Generators、疑似乱数生成器) の相互運用性が改善され、特定の実装をハードコーディングするのではなく、要求に応じてアルゴリズムを簡単に要求できるようになりました。変更点としては、PRNGの新しいインターフェース型と実装が含まれています。この中には、具体的にはジャンプ可能なPRNGや分割可能なPRNGアルゴリズムの追加クラス(LXM)、新しいRandomGeneratorFactoryクラスなどが含まれています。

JEP 382: New macOS Rendering Pipeline

この新しいパイプラインは、新しいApple Metal APIを使用するmacOS 用のJava 2Dレンダリング・パイプラインを実装することで、非推奨のApple OpenGL APIへのJDKの依存度を低減します。

JEP 415: Context-Specific Deserialization Filters

JDK 9 (JEP 290) で追加されたFilter Incoming Serialization Data(直列化データの受信のフィルタリング)が、個々のデシリアライズ操作のフィルタを選択するために起動される JVM全体のフィルタファクトリを介して、アプリケーションがコンテキストに応じて動的に選択されたデシリアライズフィルタを構成できるように改善されています。これにより、すべてのストリームの作成者にコードのアップデートを求めたり、フィルタを過度に制限的または寛容的にしたりせずに、デシリアライズフィルタを利用することが可能になります。

JEP 290: Filter Incoming Serialization Data
https://openjdk.java.net/jeps/290

3. New Platform Support

JEP 391: macOS AArch 64 Port

Appleの新しいArm 64ベースのシステム上でネイティブに動作するmacOS用のJDKバージョンを提供します。

4. Previews and Incubators

JEP 406: Pattern Matching for switch (Preview)

Javaプログラミング言語を強化し、switch文やswitch式の中でパターン・マッチングを試行できるようにします。switch文や式でパターン・マッチングを使用すると、複雑なデータ指向のクエリを簡潔かつ安全に表現できます。JEP 406は、OpenJDK Project Amberで開発されました。

Project Amber
https://openjdk.java.net/projects/amber/

JEP 412: Foreign Function and Memory API (Incubator)

JDK 14およびJDK 15で導入されたAPIを改良し、JavaプログラムがJavaランタイム外のコードやデータと相互運用できるようにしました。このAPIは、foreign functions(外部関数、つまりJVM外のコード)を効率的に呼び出したり、foreign memory(外部メモリ、つまりJVMが管理していないメモリ)に安全にアクセスすることで、JNIのような脆さや危険性を伴わずに、Javaプログラムがネイティブ・ライブラリを呼び出したり、ネイティブ・データを処理したりすることを可能にします。JEP 412は、Javaコードとforeign API(つまりJava以外のAPI)との相互作用を単純化することを目的としたOpenJDK Project Panamaで開発されました。

Project Panama
https://openjdk.java.net/projects/panama/

JEP 414: Vector API (Second Incubator)

ベクトル演算を表現するためのAPIを強化し、対応するCPUアーキテクチャ上で最適なベクトル命令に確実にコンパイルできるようになりました。ベクトル演算は、同等のスカラー演算よりも優れた性能を発揮することができ、機械学習、人工知能、暗号などの分野では非常に一般的です。JEP 412は、OpenJDK Project Panamaで開発されました。

Project Panama
https://openjdk.java.net/projects/panama/

5. Future Proofing Java Programs

JEP 403: Strongly Encapsulate JDK Internals

JDK 9からJDK 16までのように、コマンドライン・オプション1つで内部要素の強力なカプセル化を緩和することはできなくなりました。この変更により、sun.misc.Unsafeなどのいくつかの重要な内部APIを除いて、すべてがデフォルトで隠されます。既存の内部APIにアクセスすることは可能ですが、そのためには、コマンドラインパラメーターまたはJARファイルのマニフェスト属性として、カプセル化を緩和すべき各パッケージを列挙する必要があります。この変更により、アプリケーションの安全性が高まり、非標準的な内部実装への依存度が低下します。

JEP 403はJDK 16のJEP 396の流れを汲むもので、JDKはデフォルトがrelaxed strong encapsulationからstrong encapsulation へと移行しました。

JEP 396: Strongly Encapsulate JDK Internals by Default
https://openjdk.java.net/jeps/396

6. Deprecations and Removals

JEP 411: Deprecate the Security Manager for Removal

Security ManagerはJava 1.0から存在していますが、これは長年にわたってクライアント側のJavaコードを保護するための主要な手段ではなく、また、サーバー側のコードを保護するためにもほとんど使用されていませんでした。

JEP 398: Deprecate the Applet API for Removal

すべてのWebブラウザ・ベンダーがJavaブラウザ・プラグインのサポートを廃止したか、その計画を発表したため、Applet APIは無意味なものとなりました。Applet APIは、2017年9月にJava 9(JEP 289)で(削除対象ではないが)非推奨になっています。

JEP 289: Deprecate the Applet API
https://openjdk.java.net/jeps/289

JEP 407: Remove RMI Activation

Remote Method Invocation (RMI) Activationメカニズムが削除されました。この変更は、(RMI Activation以外の)RMIの残りの部分には影響しません。RMI Activationメカニズムは、2020 年 9 月のJDK 15で削除が非推奨になっていました。

JEP 385: Deprecate RMI Activation for Removal
https://openjdk.java.net/jeps/385

7. For OpenJDK Contributors

JEP 410: Remove the Experimental AOT and JIT Compiler

実験的なJavaベースのAOT(ahead-of-time)およびJIT(just-in-time)コンパイラは、JDK 9で導入されて以来、ほとんど使用されておらず、より広くサポートされている代替品が登場しています。しかしながらメンテナンスの労力は大きなものです。 オプションのコンポーネントとして、すでにJDK 16から削除されていますが、本JEPでは、OpenJDKプロジェクトからソースコードを削除します。

Tooling Support

ツールやライブラリによるタイムリーな機能のサポートは、開発者の生産性向上に貢献します。 Java 17では、最新のJavaバージョンをサポートするためにタイムリーなアップデートを行う大手IDEベンダーの努力を引き続き歓迎します。 開発者は、以下のIDEでJava 17のサポートを利用できます。

JetBrains IDEAJava 17 and IntelliJ IDEA
https://blog.jetbrains.com/idea/2021/09/java-17-and-intellij-idea/
Eclipseマーケットプレースのソリューションを利用
Java 17 Support for Eclipse 2021-09 (4.21)
https://marketplace.eclipse.org/content/java-17-support-eclipse-2021-09-421

Continue staying current with news and updates by:

Javaは、ソフトウェア・プログラマーが選択するプログラミング言語の第1位であり続けています。 Java 17とともに改良点が予定通りに提供されたことが示すように、熟考を重ねた計画とエコシステムの関与を継続することで、Javaプラットフォームは最新の開発とクラウドでの成長に向けて十分な体制を整えています。

  • Inside.Java
    OracleのJavaチームがニュースや見解を集めています。
  • Inside.Java podcasts
    Java開発者向けにOracleのJavaを作っている人から直接お届けします。Podcastでは言語やJVM、OpenJDK、プラットフォームセキュリティ、LoomやPanamaといったイノベーション・プロジェクト、その他あらゆることについて取り扱います。
  • Inside.Java Newscasts
    Inside.Java podcastを動画形式にしたものです。
  • OpenJDK mailing lists
    お気に入りのOpenJDKプロジェクトの進捗を知る場です。
  • Twitter (OpenJDK と Java)
    Javaの継続的な進化に関するアップデートやニュースをお届けするソーシャルストリーム
  • Java Magazine
    Oracleが発行する、開発者による開発者のための技術記事を提供するデジタル形式のJavaの出版物です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中