2015-05-24 19 views
14

Sản phẩm của chúng tôi là một ứng dụng máy tính để bàn OS X độc lập được viết bằng Java. Chúng tôi bao gồm một JRE được nhúng để chạy phần mềm của chúng tôi.Cách tắt cơ chế mở rộng Java

Các quy tắc cho JRE khởi động dường như đặt bất kỳ tập tin JAR trong /usr/lib/java, /Library/Java/Extensions, và ~/Library/Java/Extensions trên classpath TRƯỚC các thư viện chúng tôi một cách rõ ràng bao gồm trên classpath.

Nếu người dùng có bất kỳ tệp JAR nào trong bất kỳ thư mục cơ chế mở rộng Java nào, thì các tệp JAR đó sẽ được thêm vào đường dẫn lớp của chúng tôi. Sự cố hỗ trợ gần đây phát sinh do khách hàng có phiên bản cũ hơn của thư viện bên thứ ba quan trọng trong số /usr/lib/java - điều này đã khiến phần mềm của chúng tôi gặp sự cố bất ngờ khi khởi động.

Tôi đã không thể xác định cách tôi có thể tắt cơ chế tiện ích mở rộng này khi gọi JRE được nhúng trong ứng dụng của chúng tôi. Tôi có thể làm cái này như thế nào?

─────────
LƯU Ý: có vẻ như cơ chế mở rộng này không được chấp và cuối cùng sẽ được gỡ bỏ: https://blogs.oracle.com/java-platform-group/entry/planning_safe_removal_of_under)

+1

Tôi nghĩ rằng bạn có thể chỉ định -Djava.ext.dir để trỏ đến một vị trí an toàn. Bạn không chắc chắn nếu điều này làm việc với trình khởi chạy Mac, nó hoạt động trên Windows. – eckes

+0

Bạn có nghĩa là bạn gói JRE được nhúng vào ** tệp jar của riêng bạn ** không? Làm thế nào để bạn đóng gói/bao gồm JRE được nhúng của bạn? –

+0

Tôi không có câu trả lời hoàn chỉnh. Điều đầu tiên đến với tâm trí của tôi là sửa đổi các chính sách bảo mật của JRE. Các lớp sẽ được tải với một số cuộc gọi đến phương thức loadClass, hành vi tải phụ thuộc vào các chính sách bảo mật. –

Trả lời

7

Bạn có thể ghi đè lên các tranh cãi "java.ext.dirs" JVM để trỏ đến một số thư mục ứng dụng.

Tôi đã nhanh chóng kiểm tra ghi đè đối số JVM với lớp sau và hoạt động tốt.

$ ls /Library/Java/Extensions 
extentionstest.jar 
$ 
$java ExtentionTest 
Main method executed fine. 
$ 
$ java -Djava.ext.dirs=/home/pratapk/work/ ExtentionTest 
Error: Could not find or load main class ExtentionTest 
$ 

Và các lớp sau đây được xây dựng như extentionstest.jar và sao chép ở /Library/Java/Extensions

public class ExtentionTest { 
    public static void main(String args[]) { 
     System.out.println("Main method executed fine."); 
    } 
} 

java.ext.dirs hỗ trợ nhiều thư mục như ruột tách ra. Trong trường hợp của bạn JRE được bao gồm cùng với ứng dụng của bạn, Nó là dễ dàng hơn nhiều cho bạn bao gồm đường dẫn của lib/ext trong khi không bao gồm "/Library/Java/Extensions"

+0

Điều này đạt được những gì tôi đã yêu cầu. Tuy nhiên, khi thử nó, có vẻ như cơ chế mở rộng hiện đang rất quan trọng để tải nashorn và JavaFx. Chúng ta cần có khả năng ngăn chặn thư mục/usr/lib/java không được sử dụng; thư mục lib/ext của JRE được nhúng phải được bao gồm. –

+0

java.ext.dirs hỗ trợ nhiều thư mục dưới dạng dấu hai chấm. Trong trường hợp của bạn, JRE được bao gồm cùng với ứng dụng của bạn, Vì vậy, nó dễ dàng hơn nhiều cho bạn bao gồm đường dẫn của lib/ext trong khi không bao gồm "/ Library/Java/Extensions" –

Các vấn đề liên quan