Reading Time: 9 minutes

Trong thế giới công nghệ thông tin không ngừng biến đổi, Java luôn khẳng định vị thế của mình như một trong những ngôn ngữ lập trình mạnh mẽ và linh hoạt nhất. Với mỗi phiên bản mới, Java lại mang đến những cải tiến đáng kể, và Java 9 đã đánh dấu một cột mốc quan trọng với sự ra đời của hệ thống Module trong Java 9.

Các chủ đề chính trong Module Java 9

  • Giới thiệu tổng quan
  • Java SE 9: Dự án Jigsaw
  • Những vấn đề của hệ thống Java hiện tại ?
  • Ưu điểm của Hệ thống Module Java SE 9
  • So sánh JDK 8 và JDK 9
  • Module Java 9 là gì?
  • Mother của Hệ thống Module Java 9
  • So sánh Ứng dụng Java 8 và Java 9

Giới thiệu

Oracle Corp đã dời lịch phát hành Java 9 từ tháng 3 năm 2017 sang tháng 9 năm 2017. Như chúng ta đã biết, Java SE 8 đã mang đến ba tính năng lớn mới (cùng với một số cải tiến và tính năng bổ sung khác):

  • Lambda Expressions
  • Stream API
  • Date API

Tương tự, Java SE 9 cũng mang theo ba tính năng lớn (cùng với một số cải tiến và tính năng bổ sung khác):

  • Java Module System (Dự án Jigsaw)
  • Java REPL (JShell)
  • Milling Project Coin (cải tiến nhỏ cho ngôn ngữ)

Trong bài viết này, chúng ta sẽ tập trung thảo luận về những điều cơ bản của dự án Jigsaw của Oracle.

Java SE 9: Dự án Jigsaw

Dự án Jigsaw sẽ giới thiệu một khái niệm hoàn toàn mới trong Java SE 9: Hệ thống Module Java. Đây là một dự án rất lớn và đầy tham vọng từ Oracle Corp trong bản phát hành Java SE 9. Ban đầu, họ đã khởi động dự án này như một phần của bản phát hành Java SE 7. Tuy nhiên, với những thay đổi lớn, nó đã bị dời lại sang Java SE 8, rồi lại tiếp tục bị dời. Hiện tại, nó đã chính thức phát hành cùng Java SE 9 vào tháng 9 năm 2017.

Mục tiêu chính của Dự án Jigsaw:

  • Modular JDK: Như chúng ta đều biết, hệ thống JDK hiện tại quá lớn. Vì vậy, Oracle đã quyết định chia bản thân JDK thành các module nhỏ hơn để đạt được nhiều lợi ích (chúng ta sẽ thảo luận chi tiết hơn trong các phần tiếp theo).
  • Modular Source Code: Các tệp .jar mã nguồn hiện tại quá lớn, đặc biệt là rt.jar. Vì vậy, họ sẽ chia mã nguồn Java thành các module nhỏ hơn.
  • Modular Run-Time Images: Mục tiêu chính của tính năng này là “Tái cấu trúc hình ảnh chạy (run-time images) của JDK và JRE để phù hợp với các module”.
  • Encapsulate Most Internal APIs: Mục tiêu chính là “Làm cho hầu hết các API nội bộ của JDK không thể truy cập được theo mặc định, nhưng vẫn giữ một vài API nội bộ quan trọng, được sử dụng rộng rãi có thể truy cập được”.
  • Java Platform Module System: Mục tiêu chính của tính năng này là “Cho phép người dùng tạo module của riêng họ để phát triển ứng dụng”.
  • jlink: The Java Linker: Mục tiêu chính của công cụ jlink này là “Cho phép người dùng tạo các ứng dụng có thể thực thi được (executables)”.

Nếu bạn chưa hiểu rõ những điều này, ĐỪNG lo lắng. Chúng ta sẽ thảo luận sâu hơn về các khái niệm này với một số ví dụ hữu ích trong các phần tiếp theo và cả trong các bài viết sắp tới của tôi.

Những vấn đề của hệ thống Java hiện tại?

Trong phần này, chúng ta sẽ thảo luận về “Tại sao chúng ta cần Hệ thống Module Java SE 9?”, hay nói cách khác, những vấn đề của hệ thống Java hiện tại. Java SE 8 hoặc các hệ thống trước đó có những vấn đề sau trong việc phát triển hoặc phân phối các ứng dụng dựa trên Java:

  • JDK quá lớn: Vì JDK quá lớn, việc thu nhỏ nó để phù hợp với các thiết bị nhỏ gặp nhiều khó khăn. Java SE 8 đã giới thiệu 3 loại compact profiles (compact1, compact2, compact3) để giải quyết vấn đề này, nhưng chúng không thực sự giải quyết triệt để.
  • Tệp JAR cồng kềnh: Các tệp .jar như rt.jartools.jar quá lớn để sử dụng trong các thiết bị và ứng dụng nhỏ.
  • Hiệu suất hạn chế: Vì JDK quá lớn, các ứng dụng hoặc thiết bị của chúng ta không thể đạt được hiệu suất tốt hơn.
  • Không có Strong Encapsulation: Trong hệ thống Java hiện tại, không có cơ chế đóng gói mạnh mẽ (Strong Encapsulation) vì bộ định nghĩa truy cập public quá mở. Bất kỳ ai cũng có thể truy cập nó.
  • Khó kiểm thử và bảo trì: Vì JDK, JRE quá lớn, việc kiểm thử và bảo trì ứng dụng trở nên khó khăn.
  • Truy cập API nội bộ: Vì public quá mở, chúng ta không thể ngăn chặn việc truy cập một số API nội bộ không quan trọng như sun.*, .internal.* v.v.
  • Vấn đề bảo mật: Vì người dùng có thể truy cập các API nội bộ, bảo mật cũng trở thành một vấn đề lớn.
  • Kích thước ứng dụng lớn: Ứng dụng cuối cùng có kích thước khá lớn.
  • Khó hỗ trợ Less Coupling: Việc hỗ trợ mối liên kết lỏng lẻo (Less Coupling) giữa các thành phần gặp nhiều thách thức.

Để giải quyết tất cả những vấn đề này, Oracle Corp đã phát hành hệ thống Module Java trong bản Java SE 9.

Ưu điểm của hệ thống Module Java SE 9

Hệ thống Module Java SE 9 mang lại những lợi ích đáng kể sau:

  • Khả năng mở rộng linh hoạt: Java SE 9 chia JDK, JRE, các tệp JAR, v.v., thành các module nhỏ hơn, cho phép chúng ta chỉ sử dụng những module mà chúng ta muốn. Điều này giúp dễ dàng thu nhỏ ứng dụng Java để phù hợp với các thiết bị nhỏ.
  • Dễ kiểm thử và bảo trì: Các module giúp việc kiểm thử và bảo trì trở nên dễ dàng hơn.
  • Hiệu suất tốt hơn: Hệ thống module hỗ trợ hiệu suất tốt hơn nhờ việc tối ưu hóa tải tài nguyên.
  • Strong Encapsulation: Từ giờ, public không chỉ đơn thuần là public nữa; nó hỗ trợ cơ chế đóng gói rất mạnh mẽ. (Đừng lo lắng, đây là một khái niệm lớn. Chúng ta sẽ khám phá nó với một số ví dụ hữu ích sớm thôi).
  • Ngăn chặn truy cập API nội bộ: Chúng ta không thể truy cập các API nội bộ không quan trọng nữa.
  • Bảo mật nâng cao: Các module có thể ẩn các chi tiết không mong muốn và nội bộ một cách rất an toàn, giúp tăng cường bảo mật.
  • Kích thước ứng dụng nhỏ gọn: Ứng dụng có kích thước nhỏ gọn hơn rất nhiều vì chúng ta chỉ sử dụng những module cần thiết.
  • Hỗ trợ Less Coupling: Việc hỗ trợ mối liên kết lỏng lẻo giữa các thành phần trở nên dễ dàng.
  • Hỗ trợ Nguyên tắc Trách nhiệm Đơn lẻ (SRP): Hệ thống module giúp dễ dàng áp dụng Nguyên tắc Trách nhiệm Đơn lẻ (Single Responsibility Principle – SRP).

Chúng ta sẽ khám phá tất cả các khái niệm này từng bước một trong các bài viết sắp tới.

So sánh JDK 8 và JDK 9

Chúng ta đều biết một phần mềm JDK chứa những gì. Sau khi cài đặt phần mềm JDK 8, bạn có thể thấy một vài thư mục như bin, jre, lib v.v., trong thư mục Java Home. Tuy nhiên, Oracle Corp đã thay đổi cấu trúc thư mục này một chút trong JDK 9 như sau:

Module trong Java 9

Cấu trúc thư mục JDK 8:

khám phá Module trong Java 9

Cấu trúc thư mục JDK 9:

Module trong Java 9

Ở đây, JDK 9 không còn chứa JRE bên trong nữa. Trong JDK 9, JRE được tách thành một thư mục phân phối riêng. Phần mềm JDK 9 chứa một thư mục mới tên là “jmods“. Nó chứa một tập hợp các Module Java 9 như hình trên.

Trong JDK 9, không còn rt.jartools.jar nữa!

LƯU Ý: Tính đến thời điểm hiện tại, thư mục “jmods” chứa khoảng 95 module. Số lượng này có thể tăng lên trong bản phát hành cuối cùng. Thư mục “jmods” nằm tại ${JAVA_HOME}/jmods. Chúng được gọi là các JDK Modules.

Module Java 9 là gì?

Một Module là một tập hợp tự mô tả của Mã (Code), Dữ liệu (Data) và một số Tài nguyên (Resources). Nó là một tập hợp các PackageType (các lớp, lớp trừu tượng, giao diện, v.v.) có liên quan, cùng với Mã & Dữ liệu và Tài nguyên. Mỗi Module chỉ chứa một tập hợp các mã và dữ liệu liên quan để hỗ trợ Nguyên tắc Trách nhiệm Đơn lẻ (Single Responsibility Principle – SRP).

Module Java 9

Mục tiêu chính của Hệ thống Module Java 9 là hỗ trợ Lập trình Modular trong Java.

Mother của Hệ thống Module Java 9

Tính đến thời điểm hiện tại, Hệ thống Module Java 9 có khoảng 95 module trong phiên bản Early Access JDK. Oracle Corp đã tách các tệp JAR của JDK và các đặc tả Java SE thành hai bộ Module:

  • Tất cả các JDK Modules bắt đầu bằng "jdk.*"
  • Tất cả các Java SE Specifications Modules bắt đầu bằng "java.*"

Hệ thống Module Java 9 có một module đặc biệt là “java.base“. Nó được biết đến là Module cơ sở (Base Module). Đây là một module độc lập và không phụ thuộc vào bất kỳ module nào khác. Theo mặc định, tất cả các module khác đều phụ thuộc vào module này. Đó là lý do tại sao module “java.base” còn được gọi là “Mẹ” của các Module Java 9. Nó là module mặc định cho tất cả các JDK Modules và các Module do người dùng định nghĩa.

So sánh Ứng dụng Java 8 và Java 9

Chúng ta đã phát triển rất nhiều ứng dụng Java bằng Java 5, 6, 7 hoặc 8. Chúng ta đều biết một ứng dụng Java 8 hoặc các phiên bản trước đó trông như thế nào và chứa những gì. Tóm lại, tôi đã mô tả một ứng dụng Java 8 trong sơ đồ dưới đây (tưởng tượng có sơ đồ ở đây):

Module trong Java 9

Trong một ứng dụng Java 8 hoặc các phiên bản trước đó, thành phần cấp cao nhất là một Package. Nó nhóm một tập hợp các loại liên quan thành một nhóm. Nó cũng chứa một tập hợp các tài nguyên.

Ứng dụng Java 9 không có nhiều khác biệt lớn so với điều này. Nó chỉ giới thiệu một thành phần mới được gọi là “Module“, được sử dụng để nhóm một tập hợp các Package liên quan thành một nhóm. Và một thành phần mới nữa là Module Descriptor (module-info.java). Chỉ vậy thôi. Phần còn lại của ứng dụng tương tự như các phiên bản ứng dụng trước đó như sau (tưởng tượng có sơ đồ ở đây):

ví dụ về Module trong Java 9

Giống như các ứng dụng Java 8 có Package là thành phần cấp cao nhất, các ứng dụng Java 9 có Module là thành phần cấp cao nhất.

LƯU Ý: Mỗi Module Java 9 chỉ có duy nhất một Module và một Module Descriptor. Không giống như các Package Java 8, chúng ta không thể tạo nhiều module trong một Module duy nhất.

Tóm lại, tôi có thể nói một Module Java 9 chứa các thành phần chính sau:

  • Một Module
  • Tên Module
  • Module Descriptor (module-info.java)
  • Tập hợp các Package
  • Tập hợp các Type (lớp, giao diện, enum,…) và Tài nguyên

Ở đây, Tài nguyên có thể là module-info.java (Module Descriptor) hoặc bất kỳ thuộc tính hay tệp XML nào khác.

Kết luận

Với Module trong Java 9, chúng ta đã chứng kiến một bước tiến đáng kể trong cách Java tổ chức và quản lý code. Dự án Jigsaw không chỉ đơn thuần là một bản cập nhật mà nó còn định hình lại tương lai của việc phát triển ứng dụng Java.

Việc nắm vững các khái niệm về module sẽ giúp bạn xây dựng các ứng dụng Java mạnh mẽ hơn, dễ quản lý hơn và tối ưu hơn trong môi trường hiện đại, từ các hệ thống lớn cho đến các ứng dụng nhúng nhỏ gọn. Đây là kiến thức nền tảng vô cùng giá trị khi bạn tiếp tục hành trình phát triển với Java.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất