Những thay đổi trong Java 9 mà bạn cần phải biết

1631

Project Jigsaw đã tạo ra hiệu ứng lan truyền trong toàn bộ hệ ecosystem của Java. Sự ảnh hưởng to lớn của nó không đến từ mức độ phức tạp mà là nằm ở việc chúng ta có gắn mọi thứ vào cho dù nó vốn không có trong giai đoạn thiết kế ban đầu. Trong hơn một thập kỉ vừa qua, Java đã trở thành một platform đáng tin cậy cho nhiều app khác nhau. Do đó, một thay đổi nhỏ trong cấu trúc cũng có khả năng gây ra thảm họa nếu có error. Do đó mà nhóm phát triển phải bảo đảm sự an toàn cũng như những ảnh hưởng lên hệ thống. Ý tưởng modularizing Java vốn đã xuất hiện từ phiên bản 8 nhưng cho tới khi Java 9 được push lên vào ngày 21 tháng 9 vừa rồi. Bài viết này sẽ miêu tả những thay đổi cấu trúc quan trọng từ JRE (Java Runtime Environment) và JDK do modularization.

Tổng quan

Ngoài việc tận dụng khả năng encapsulation mạnh mẽ, một trong những điểm mạnh chính Java Module System là để khiến modular của nó có khả năng mở rộng đủ để deploy ngay cả thiết bị nhỏ nhất. JRE chính là nền tảng của Java Platform và JDK cung cấp đủ yếu tố cần thiết cho một program chạy trong môi trường đó. JDK tuy vậy cũng bao gồm cả JRE. Code được tạo ra bởi Java compiler sẽ chỉ hiểu được bởi virtual machine, vốn cũng là một phần của JRE. Các dịch vụ như libraries, garbage collection, v.v… cũng là một phần của runtime. Trước khi Java 9 xuất hiện, một program vốn chỉ cần một subset service không có lựa chọn nào ngoài ship toàn bộ JRE với program đó. Đây là một vấn đề tương tự như khi bạn phải đem theo cả pháo đài trong khi chỉ cần một khẩu súng thôi.

JDK Directory Structure

Mục tiêu chính của việc modularizing JDK và JRE là để cải thiện hiệu năng, dễ bảo trì và tăng tính bảo mật. JRE là core platform của Java trong khi JDK chứa JRE và các development tools cũng như libraries nhằm giúp tạo các Java application chạy trên JRE. Bạn có thể cài đặt JRE hoặc JDK tùy theo yêu cầu. Sự thay đổi rõ rệt nhất nằm trong directory structure, được sắp sếp bởi Java 9.

Trước phiên bản thứ 9, JDK Directory có cấu trúc như sau:

JDK directory chính là directory “gốc” của JDK software installation. Nó chứa copyright, license, và README files. Nó cũng có cả src.zip, archive của source code dành cho Java platform.

  • JDK/bin directory chứa tools chạy từ command line, như javac, javap, jconsole, jar, javadoc, v.v… Những tools này được dùng để compiling, debugging, archiving và, cho các mục đích phát triển khác. Thông thường,  PATH environment variable chứa một entry cho directory này.
  • JDK/db directory chứa Java DB database.
  • JDK/include directory chứa C-language header files để hỗ trợ cho native-code programming với Java Native Interface và Java Virtual Machine (JVM) Debugger Interface.
  • JDK/jre directory là directory “gốc” của Java Runtime Environment (JRE) được dùng bởi JDK development tools.
    • JDK/jre/bin directory chứa executable files cho tools và libraries được dùng bởi Java platform.
    • JDK/jre/lib directory chứa code libraries, property settings, và resource files được dùng bởi JRE.
  • JDK/lib directory chứa files được dùng bởi development tools, như tools.jar, vốn chứa non-core classes để support tools và utilities trong JDK.
  • JDK/man directory chứa nhiều pages cho JDK tools.

Directory structure mới trong Java 9:

 

Bạn có thể thấy directory structure của JDK và JRE gần như không đổi, ngoại trừ JDK có 2 directories: jmodsinclude. Và cũng không hề có jre sub directory trong JDK9.

  • JDK directory directory “gốc” của JDK software installation. Directory này cũng chứa copyright, README, và src.zip files, cũng chính là source code archive file của Java platform.
    • JDK/bin directory chứa executable và command-line launchers vốn được defined bởi modules linked tới hình.
    • JDK/conf directory chứa .properties, .policy, và configuration files khác dành cho việc edit bởi developers, deployers, và end users.
    • JDK/lib directory chứa các thông tin về private implementation của runtime system. Các files không dành cho việc dùng bên ngoài và không được modified.
    • JDK/jmods directory chứa compiled module definitions.
    • JDK/legal directory chứa copyright và license files cho từng module.
    • JDK/include directory chứa C-language header files vốn support cho native-code programming với Java Native Interface và Java Virtual Machine (JVM) Debugger Interface.
  • JRE là directory “gốc” của JRE software installation. Directory này chứa README và các JRE folders khác.
    • JRE/bin directory chứa executable và command-line launchers vốn được defined bởi modules linked tới hình.
    • JRE/conf directory chứa .properties, .policy, và các configuration files vốn được edit bởi developers, deployers, và end users.
    • JRE/lib directory chứa các chi tiết về private implementation của runtime system. Các files không dành cho việc dùng bên ngoài và không được modified.
    • JRE/legal directory chứa copyright và license files cho từng module.

JDK Modules

Toàn bộ JDK đã được chia thành một set các modules. Do đó, ta có thể chọn một set tùy theo yêu cầu khi compilation, build time, hoặc trong khi run time với nhiều configurations khác nhau. Module dành riêng cho JDK có tên bắt đầu với “jdk”.

Module Description
jdk.accessibility Defines JDK utility classes được dùng bởi implementers của Assistive Technologies.
jdk.attach Defines API.
jdk.charsets Cung cấp charsets không có trong java.base.
jdk.compiler Defines implementation của hệ thống Java compiler và command line javac, cũng như javah.
jdk.crypto.cryptoki Cung cấp SunPKCS11 security provider.
jdk.crypto.ec Cung cấp SunEC security provider.
jdk.dynalink Defines API dành cho dynamic linking của operations level cao trong objects.
jdk.editpad Cung cấp dịch vụ edit pad được dùng bởi jdk.jshell.
jdk.hotspot.agent Defines implementation của HotSpot Serviceability Agent.
jdk.httpserver Defines HTTP server API của JDK.
jdk.incubator.httpclient Defines high-level HTTP và WebSocket API.
jdk.jartool Defines tools quản lí Java Archive (JAR) files,bao gồm jarjarsigner tools.
jdk.javadoc Defines hệ thống documentation tool và command line của nó, javadoc.
jdk.jcmd Defines tools cho chuẩn đoán và xử lý sự cố một JVM, như jcmd, jps, và jstat tools.
jdk.jconsole Defines JMX graphical tool, jconsole, dành cho việc theo dõi và quản lí một app.
jdk.jdeps Defines tools cho phân tích dependencies trong Java libraries và programs, bao gồm jdeps, javap, và jdeprscan tools.
jdk.jdi Defines Java Debug Interface.
jdk.jdwp.agent Cung cấp Java Debug Wire Protocol (JDWP) agent.
jdk.jlink Defines jlink tool cho việc tạo hình ảnh trong run-time, jmod tool cho việc tạo và quản lí JMOD files, và jimage tool cho kiểm tra JDK implementation-specific container file cho classes và resources.
jdk.jshell This module Cung cấp support cho Java Programming Language ‘snippet’ evaluating tools, such as Read-Eval-Print Loops (REPLs), including jshell tool.
jdk.jsobject Defines API cho JavaScript Object.
jdk.jstatd Defines jstatd tool cho việc bắt đầu với một daemon cho jstat tool để theo dõi JVM statistics.
jdk.localedata Cung cấp locale data cho locales other than US.
jdk.management Defines JDK-specific management interfaces cho JVM.
jdk.management.agent Defines JMX management agent.
jdk.naming.dns Cung cấp implementation của DNS Java Naming provider.
jdk.naming.rmi Cung cấp implementation của RMI Java Naming provider.
jdk.net Defines JDK-specific Networking API.
jdk.pack Defines tools cho việc chuyển đổi JAR file vào một pack200 file nén và biến một packed file thành JAR file, bao gồm pack200unpack200 tools.
jdk.packager.services Defines service được dùng bởi Java packager tool.
jdk.policytool Defines GUI tool cho managing policy files, called policytool.
jdk.rmic Defines rmic compiler cho generating stubs và skeletons using Java Remote Method Protocol (JRMP) và stubs cũng như tie class files (IIOP protocol) cho remote objects.
jdk.scripting.nashorn Cung cấp implementation của Nashorn script engine và runtime environment cho programs trong ECMAScript 5.1.
jdk.sctp Defines JDK-specific API cho SCTP.
jdk.security.auth Cung cấp implementations của javax.security.auth.* interfaces và các authentication modules.
jdk.security.jgss Defines Java extensions cho GSS-API và một implementation của SASL GSSAPI mechanism.
jdk.snmp Defines SNMP management agent.
jdk.xml.dom Defines subset của W3C Document Object Model (DOM) API , vốn không có trong Java SE API.
jdk.zipfs Cung cấp implementation của zip file system provider.

Tác dụng của Modular JDK

Modular JDK cho phép bạn khá tự trong trong việc kết hợp các JDK modules thành custom configurations khác nhau tùy theo yêu cầu. Custom configuration có thế mạnh không chỉ nằm ở việc cho ra Java application có thể mở rộng dễ dàng mà con shipping nó trong runtime như là một platform mở rộng. Nhờ đó mà hiệu năng được cải thiện, dễ bảo trì cũng như bảo đảm tính bảo mật. Cấu trúc Modular cũng giới thiệu URI scheme mới cho việc naming modules, classes, và cách lưu trữ resources  trong một runtime image. Phần lớn các JDK API bên trong đều được giấu kĩ trừ một số trường hợp đặc biệt.

Lời kết

Java 9 lấy ý tưởng modularity từ đàn anh đi trước và đưa nó lên một level hoàn toàn mới. Tuy vậy, JDK modularity sẽ không ảnh hưởng tới nhiều application developers. Thế nhưng việc thay đổi cấu trúc của APIs bên trong là điều cần thiết với các developer làm core Java SE Platform. Nhưng nếu bạn không muốn thì vẫn có thể xài Java 8 trong khi chờ đợi phiên bản mới trưởng thành hơn trong tương lai.

Techtalk via Developer

CHIA SẺ