Bảo vệ ứng dụng JavaFX

Cả ứng dụng Java thông thường lẫn ứng dụng máy tính để bàn Spring Boot đều bật được JavaFX. Môi trường chạy gọn nhẹ của P4JX mặc định không kèm JavaFX: bạn phải bật nó một cách rõ ràng, hoặc để lượt quét tương thích tự bật.

1. Thao tác trên giao diện đồ họa

  1. Với ứng dụng JavaFX thông thường, chọn Ứng dụng Java ở trang loại ứng dụng. Với ứng dụng để bàn JavaFX dựng trên vùng chứa Spring, chọn Spring Boot. Mã hóa thư viện chỉ tạo kho lưu trữ đã bảo vệ và không thay thế được việc đóng gói một ứng dụng JavaFX thực thụ.

    Chọn Ứng dụng Java hoặc Spring Boot

  2. Chọn tệp JAR đầu vào, phiên bản Java đi kèm và các nền tảng mục tiêu, rồi chọn chế độ đơn giản hoặc nâng cao. Thành phần JavaFX được tải riêng cho từng phiên bản Java và từng nền tảng, nên tác vụ nhiều nền tảng sẽ tạo ra các gói đầu ra độc lập.

    Chọn đầu vào, phiên bản Java, nền tảng mục tiêu và chế độ

  3. Ở chế độ đơn giản, nếu lượt quét tương thích thấy tham chiếu javafx.* hoặc phụ thuộc JavaFX, nó sẽ tự bật JavaFX và giải thích lý do trong kết quả quét. Nếu thấy cả javafx.scene.web, WebView cũng được đưa vào. Quét chỉ là phân tích tĩnh theo phỏng đoán, nên khi sang trang đầu ra hãy xem lại phần tóm tắt JavaFX.

  4. Ở chế độ nâng cao, trong thẻ Môi trường chạy JavaFX, đánh dấu Đưa JavaFX vào runtime đóng gói rồi chọn cách xử lý WebView:

    • Tự động (phát hiện javafx.scene.web): quyết định dựa trên việc ứng dụng có tham chiếu javafx.scene.web hay không;
    • Bao gồm: luôn đưa WebView (fx-webkit) vào;
    • Loại trừ: không bao giờ đưa vào.

    Với ứng dụng Java thông thường, thẻ này có dạng như sau:

    Thẻ môi trường chạy JavaFX trong tùy chọn nâng cao của ứng dụng Java thông thường

    Ứng dụng để bàn Spring Boot dùng thẻ cùng tên:

    Thẻ môi trường chạy JavaFX trong tùy chọn nâng cao của Spring Boot

  5. Sau khi chọn thư mục xuất, hãy xác nhận phần tóm tắt ghi JavaFX là đã tích hợp và trạng thái WebView đúng như mong đợi, rồi bấm Chạy bảo vệ. Khi gói đã tạo xong, dùng tập lệnh khởi chạy trong gói để kiểm tra cửa sổ, FXML, tài nguyên CSS và hình ảnh, cùng WebView trên từng nền tảng mục tiêu.

Thành phần WebView chiếm khoảng 40 MB. Nếu không dùng tới, hãy chọn Loại trừ để gói nhẹ hơn. Các thiết lập còn lại ở trang nâng cao được mô tả trong Thiết lập chế độ nâng cao của Protector4J.

2. Tải thành phần bằng dòng lệnh

p4j javaapp fx-app.jar dist --javafx

Với Spring Boot kèm JavaFX:

p4j springboot fx-boot.jar dist --javafx

Buộc đưa vào hoặc loại bỏ WebView:

--javafx-webview
--no-javafx-webview

Công cụ tải thành phần phù hợp từ trang tải công khai của khu vực bạn, dựa theo nhánh JDK và nền tảng mục tiêu. Cả việc tải JavaFX lẫn tải VLX JRE đều không đòi hỏi giao khóa lưu trữ đám mây cho máy khách.

3. Thành phần dùng ngoại tuyến

Dòng lệnh chấp nhận một thư mục cục bộ:

p4j javaapp fx-app.jar dist --javafx /opt/p4jx-fx

Thư mục đó có thể ở một trong hai dạng:

  • fx-core.tar.gz cùng fx-webkit.tar.gz không bắt buộc;
  • một cây tệp JavaFX đã giải nén sẵn, lấy lib/ làm gốc.

Giao diện đồ họa không có mục chọn thư mục JavaFX cục bộ, nên khi ngoại tuyến hãy dùng dòng lệnh.

4. FXML

Nếu ứng dụng dùng FXMLLoader, lượt quét tương thích sẽ khuyên bật lớp phủ ZIP cho trình quét:

p4j javaapp fx-app.jar dist --javafx --zip-overlay scanner

Tài nguyên FXML, chữ ký của controller và việc quét framework đều phải kiểm chứng bằng cách khởi chạy thật ứng dụng trên nền tảng mục tiêu.

5. Java 8 so với Java 11 trở lên

  • Java 8 dùng jfxrt.jar và mô hình thư mục mở rộng, nên tập lệnh sinh ra thường không cần tùy chọn mô-đun.
  • Java 11 trở lên dùng các JAR JavaFX theo mô-đun, và tập lệnh sinh ra sẽ tự đặt đường dẫn mô-đun riêng kèm --add-modules.

Hãy luôn khởi chạy qua run.sh, run.command hoặc run.bat đã sinh. Đừng tự trỏ đường dẫn mô-đun vào toàn bộ vlxjre/lib.

6. Cách bộ phát hiện tự động quyết định

Bộ phát hiện xem xét các tham chiếu lớp trong mã của chính bạn và tên tệp của các JAR phụ thuộc. Nó cố ý không soi bytecode của mọi phụ thuộc bên thứ ba: làm vậy sẽ khiến những phần tích hợp JavaFX chỉ mang tính tùy chọn bị coi là đang thật sự được dùng.

Nếu JavaFX bị nhúng bằng shading vào một phụ thuộc mà tên gọi không hé lộ điều đó, bộ phát hiện tự động có thể bỏ sót. Khi ấy hãy chỉ định rõ --javafx.

7. Phạm vi bảo vệ được khuyến nghị

  • Có nên bảo vệ các lớp con của Application trong JavaFX, controller FXML và mô hình thuộc tính hay không còn tùy vào cách chúng hoạt động khi kiểm thử trên phiên bản Java mục tiêu của bạn.
  • Các lớp cầu nối bị JNI hoặc mã gốc truy cập trực tiếp nên để không bảo vệ.
  • Hãy bắt đầu bằng chế độ đơn giản hoặc --compat-scan, sau đó kiểm thử hồi quy việc mở cửa sổ, nạp FXML, tài nguyên CSS và hình ảnh, WebView cùng các thư viện gốc của nền tảng.