Hướng dẫn về jlink

1. Khái quát chung

jlink là một công cụ tạo hình ảnh thời gian chạy Java tùy chỉnh chỉ chứa các mô-đun nền tảng được yêu cầu cho một ứng dụng nhất định.

Một hình ảnh thời gian chạy như vậy hoạt động giống hệt như JRE nhưng chỉ chứa các mô-đun mà chúng tôi đã chọn và các phụ thuộc mà chúng cần để hoạt động. Khái niệm về hình ảnh thời gian chạy mô-đun đã được giới thiệu trong JEP 220.

Trong hướng dẫn này, chúng ta sẽ học cách tạo một JRE tùy chỉnh bằng cách sử dụng jlink và chúng ta cũng sẽ chạy và kiểm tra xem mô-đun của chúng ta có hoạt động chính xác bên trong JRE của chúng ta hay không.

2. Cần tạo một JRE tùy chỉnh

Hãy cùng tìm hiểu động lực đằng sau hình ảnh thời gian chạy tùy chỉnh với một ví dụ.

Chúng tôi sẽ tạo một ứng dụng mô-đun đơn giản. Để biết thêm về cách tạo ứng dụng mô-đun, vui lòng tham khảo bài viết của chúng tôi về mô-đun.

Đầu tiên, hãy tạo một lớp HelloWorld và một mô-đun tương ứng:

public class HelloWorld { private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName()); public static void main(String[] args) { LOG.info("Hello World!"); } }
module jlinkModule { requires java.logging; }

Để chạy chương trình này, chúng ta chỉ cần các lớp HelloWorld, String , LoggerObject .

Mặc dù chương trình này chỉ cần bốn lớp để chạy, tất cả các lớp được xác định trước trong JRE cũng được thực thi, ngay cả khi chương trình của chúng tôi không yêu cầu chúng.

Do đó, để chạy một chương trình nhỏ, chúng ta phải duy trì một JRE hoàn chỉnh, điều này đơn giản là lãng phí bộ nhớ.

Vì vậy, một JRE tùy chỉnh là lựa chọn tốt nhất để chạy ví dụ của chúng tôi.

Với jlink , chúng ta có thể tạo JRE nhỏ của riêng mình, chỉ chứa các lớp có liên quan mà chúng ta muốn sử dụng, mà không lãng phí bộ nhớ và kết quả là chúng ta sẽ thấy hiệu suất tăng lên.

3. Xây dựng hình ảnh thời gian chạy Java tùy chỉnh

Chúng tôi sẽ thực hiện một loạt các bước đơn giản để tạo hình ảnh JRE tùy chỉnh.

3.1. Biên soạn một mô-đun

Đầu tiên, hãy biên dịch chương trình được đề cập ở trên từ dòng lệnh:

javac -d out module-info.java
javac -d out --module-path out com\baeldung\jlink\HelloWorld.java

Bây giờ, hãy chạy chương trình:

java --module-path out --module jlinkModule/com.baeldung.jlink.HelloWorld

Đầu ra sẽ là:

Mar 13, 2019 10:15:40 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!

3.2. Sử dụng jdeps để liệt kê các mô-đun phụ thuộc

Để sử dụng jlink , chúng ta cần biết danh sách các mô-đun JDK mà ứng dụng sử dụng và chúng ta nên đưa vào JRE tùy chỉnh của mình.

Hãy sử dụng lệnh jdeps để lấy các mô-đun phụ thuộc được sử dụng trong ứng dụng:

jdeps --module-path out -s --module jlinkModule

Đầu ra sẽ là:

jlinkModule -> java.base jlinkModule -> java.logging

Điều này có ý nghĩa, vì java.base là mô-đun tối thiểu cần thiết cho các thư viện mã Java và java.logging được sử dụng bởi một trình ghi nhật ký trong chương trình của chúng tôi.

3.3. Tạo một JRE tùy chỉnh với jlink

Để tạo JRE tùy chỉnh cho ứng dụng dựa trên mô-đun, chúng ta có thể sử dụng lệnh jlink . Đây là cú pháp cơ bản của nó:

jlink [options] –module-path modulepath –add-modules module [, module…] --output 

Bây giờ, hãy tạo một JRE tùy chỉnh cho chương trình của chúng tôi bằng cách sử dụng Java 11:

jlink --module-path "%JAVA_HOME%\jmods";out --add-modules jlinkModule --output customjre

Ở đây, giá trị sau tham số –add-modules cho jlink biết mô-đun nào cần đưa vào JRE.

Cuối cùng, customjre bên cạnh tham số –output xác định thư mục đích nơi JRE tùy chỉnh của chúng ta sẽ được tạo.

Lưu ý, chúng tôi sử dụng Windows shell để thực thi tất cả các lệnh trong suốt hướng dẫn này. Người dùng Linux và Mac có thể phải điều chỉnh chúng một chút.

3.4. Chạy một ứng dụng với hình ảnh đã tạo

Bây giờ, chúng tôi có JRE tùy chỉnh của chúng tôi được tạo bởi jlink .

Để kiểm tra JRE của chúng tôi, hãy thử chạy mô-đun của chúng tôi bằng cách điều hướng bên trong thư mục bin của thư mục customjre của chúng tôi và chạy lệnh bên dưới:

java --module jlinkModule/com.baeldung.jlink.HelloWorld

Một lần nữa, trình bao Windows, mà chúng tôi sử dụng, sẽ tìm trong thư mục hiện tại cho bất kỳ tệp thực thi nào trước khi tiếp tục với PATH. Chúng tôi cần chú ý thêm để thực sự chạy JRE tùy chỉnh của chúng tôi, chứ không phải java được giải quyết dựa trên PATH khi chúng tôi đang sử dụng Linux hoặc Mac.

4. Tạo JRE tùy chỉnh với Tập lệnh trình khởi chạy

Theo tùy chọn, chúng tôi cũng có thể tạo một JRE tùy chỉnh với các tập lệnh trình khởi chạy thực thi .

For this, we need to run the jlink command that has an extra –launcher parameter to create our launcher with our module and main class:

jlink --launcher customjrelauncher=jlinkModule/com.baeldung.jlink.HelloWorld --module-path "%JAVA_HOME%\jmods";out --add-modules jlinkModule --output customjre

This will generate two scripts: customjrelauncher.bat and customjrelauncher inside our customjre/bin directory.

Let's run the script:

customjrelauncher.bat

And the output will be:

Mar 18, 2019 12:34:21 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!

5. Conclusion

In this tutorial, we have learned how we can create a custom, modular JRE with jlink that only contains the bare minimum files needed for our module. We also looked into how to create a custom JRE with launcher scripts that can be easily executed and shipped.

Hình ảnh thời gian chạy Java mô-đun, tùy chỉnh rất mạnh mẽ. Các mục tiêu để tạo JRE tùy chỉnh rất rõ ràng: chúng tiết kiệm bộ nhớ, cải thiện hiệu suất và cũng tăng cường bảo mật và khả năng bảo trì. Các JRE tùy chỉnh nhẹ cũng cho phép chúng tôi tạo các ứng dụng có thể mở rộng cho các thiết bị nhỏ.

Các đoạn mã được sử dụng trong hướng dẫn này có sẵn trên Github.