Tính tương thích và phạm vi bảo vệ

P4JX sẽ mã hóa các phương thức triển khai của lớp được bảo vệ và chỉ cho phép VLX JRE đi kèm với gói phần mềm đọc chúng trong lúc chạy. Để cân bằng giữa hiệu quả bảo vệ và tính tương thích với framework, nên chỉ bảo vệ các phần triển khai nghiệp vụ cốt lõi; các điểm vào framework, DTO/thực thể, các lớp cần được framework tạo hoặc sửa đổi động, cùng các phụ thuộc từ bên thứ ba không nên được bảo vệ.

1. Chạy quét tính tương thích trước

Chỉ quét, không xuất kết quả:

p4j javaapp app.jar --compat-scan
p4j springboot app.jar --compat-scan
p4j tomcat app.war --compat-scan

Quét và áp dụng các khuyến nghị thận trọng:

p4j springboot app.jar dist --compat-apply

Các tùy chọn do người dùng chỉ định sẽ có ưu tiên hơn các khuyến nghị tự động. Việc quét là phân tích heuristic tĩnh; báo cáo “Cần tiến hành kiểm tra lại.” không có nghĩa là việc áp dụng chắc chắn sẽ thất bại; báo cáo không có vấn đề cũng không thể thay thế việc kiểm thử lại trên nền tảng mục tiêu.

Khi kết quả quét yêu cầu sửa đổi mã nguồn

Nếu báo cáo GUI hiển thị Cần thực hiện thao tác. (giao diện tiếng Anh là ACTION REQUIRED), điều đó có nghĩa là: Người dùng phải sửa đổi mã nguồn của ứng dụng.; những vấn đề loại này không thể được giải quyết bằng cách điều chỉnh các tham số đóng gói. Báo cáo sẽ liệt kê các lớp và phương thức cần sửa đổi, đồng thời đưa ra các khuyến nghị xử lý tương ứng.

  • Đọc ZIP/JAR từ bộ nhớ:Hãy thay đổi ByteArrayInputStream thành các phương thức đọc dữ liệu dựa trên tệp như Files.newInputStream(Path), FileInputStream, ZipFile hoặc JarFile.
  • Định nghĩa lớp từ byte gốc:Không nên gọi trực tiếp ClassLoader#defineClass đối với các lớp được bảo vệ, hãy sử dụng Class.forName() hoặc ClassLoader.loadClass() thay thế để cho phép P4JX thực hiện việc tải lớp khi chương trình đang chạy.

Sau khi chỉnh sửa mã nguồn, hãy xây dựng lại tệp JAR/WAR và tiến hành quét khả năng tương thích một lần nữa; chỉ khi báo cáo không còn liệt kê vấn đề đó nữa thì mới tạo ra gói bảo vệ.

2. Mô hình bảo vệ được khuyến nghị

Đầu vào biên giới/cơ sở hạ tầng công khai → facade thông thường hoặc giao diện → Phần triển khai lõi được bảo vệ

Ví dụ:

--protect 'com.example.service.impl.**' \
--exclude 'com.example.dto.**,com.example.config.**'

3. Các lớp thường không nên được bảo vệ

  • Controller, Servlet, Filter, Listener, Advice;
  • Các đối tượng được tăng cường bằng Spring Configuration, AOT/CGLIB;
  • Các mô hình serialization như Jackson DTO, record, JPA Entity;
  • Các lớp kết nối kiểu JNI/SWT/native;
  • Các lớp được viết lại hoặc định nghĩa lại bởi Agent, ORM, Mock, hot reload hoặc ClassLoader tùy chỉnh;
  • Các framework bên thứ ba và các phụ thuộc mã nguồn mở;
  • Các lớp cần đọc mã bytecode class thực sự của chính nó.

4. Các tính năng JVM không được hỗ trợ hoặc bị hạn chế

Môi trường chạy

  • Các ứng dụng được bảo vệ phải sử dụng VLX JRE đi kèm gói phần mềm;
  • Không hỗ trợ cách khởi động theo JPMS -m và cách khởi động từ mã nguồn đơn tập tin;
  • Các tập tin JAR thông thường trongclasspath phải được trình đóng gói đăng ký, không thể tự ý thêm vào khi triển khai;
  • Không nên sử dụng VLX JRE để chạy các ứng dụng thông thường chưa được bảo vệ.

Gỡ lỗi và Agent

  • Không hỗ trợ các công cụ gỡ lỗi JVMTI, JDWP, công cụ phân tích hiệu suất, công cụ đo tỷ lệ phủ lớp mã và hầu hết các agent APM;
  • Không hỗ trợ -javaagent, -agentlib, chức năng tải lại nhiệt và việc định nghĩa lại lớp;
  • Các thao tác cần việc dệt mã bytecode phải được thực hiện trước khi mã hóa.

Tối ưu hóa khi khởi động

  • Không hỗ trợ CDS, AppCDS và AOT;
  • ZGC và ShenandoahGC nằm ngoài phạm vi hỗ trợ tại thời gian chạy P4JX.

5. Tài nguyên lớp và trình quét

Khi đọc tài nguyên .class của các lớp được bảo vệ, người dùng chỉ nhận được dữ liệu siêu dữ liệu: giữ nguyên tên lớp, chữ ký và ghi chú, nhưng không bao gồm thân phương thức thực tế.

  • Phương thức phản xạ thông thường có thể đọc siêu dữ liệu, nhưng không thể khôi phục mã byte gốc;
  • Các công cụ tự phân tích tập tin ZIP vật lý mặc định sẽ không thể hiển thị nội dung của P4JX; có thể thử sử dụng --zip-overlay scanner;
  • Các trình quét classpath như ClassGraph, Reflections có thể cần đến --layout fat trong môi trường Spring Boot;
  • Việc phân tích P4JX từ bộ nhớ hoặc luồng mạng bằng ZipInputStream/JarInputStream không được hỗ trợ;
  • Giao diện zipfs chỉ có chế độ đọc, không thể chỉnh sửa tập tin nén.

6. Hành vi lưu trữ

  • Phần mở rộng .jar không đồng nghĩa với tập tin JAR thông thường; nội dung vẫn là P4JX;
  • Tập tin JAR Multi-Release sẽ được giải nén tùy theo phiên bản Java mục tiêu khi mã hóa;
  • Chữ ký và thông tin chứng chỉ của tập tin JAR gốc sẽ không được giữ nguyên; khi cần thiết, phải thực hiện việc ký số cho sản phẩm cuối cùng ở bên ngoài;
  • Không được sửa đổi, nén lại hoặc kết hợp các tập tin P4JX được tạo ra.