2011-11-25 24 views
11

Tôi đang cố gắng cấm gọi tới System.exit(int); trong một số lọ.cấm gọi tới System.exit

Những lọ này sẽ được phát triển bởi các nhóm bên ngoài và được tải bởi ứng dụng "vùng chứa" của chúng tôi.

phản xạ đầu tiên của tôi là sử dụng quản lý bảo mật java:

-Djava.security.manager-Djava.security.debug=all 

với ${user.home}/.java.policy tập tin đơn giản nhất:

grant {}; 

Mặc dù tôi không còn có thể gọi như System.getProperties() (kể từ Tôi không có java.util.PropertyPermission), tôi có thể làm một System.exit (0) !!

Tùy chọn java.security.debug=all cho giao diện điều khiển sau:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>) 
sun.misc.Launcher $ AppClassLoader @ 10385c1 
<no principals> 
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM) 
(java.io.FilePermission \my-bin-path\- read) 
) 

Tại sao mọi tầng lớp trong my-bin-con đường đã java.lang.RuntimePermission exitVM cấp ?????

nhờ

+0

Rõ ràng 'java.lang.RuntimePermission exitVM' được cấp theo mặc định, có thể bạn phải từ chối nó một cách rõ ràng. – Romain

+0

Tôi hy vọng quyền thoátVM được bật theo mặc định. Nếu một đoạn mã Java kết thúc quá trình thực hiện của nó thì có thể nó cần gọi ngầm là System.exit (0) để báo cho VM biết nó đã được thực hiện. – Chris

+0

Tôi giả định rằng bạn muốn biết cách tắt nó đi, sẽ khuyên bạn nên chỉnh sửa câu hỏi để yêu cầu cụ thể điều đó. – Chris

Trả lời

2

Từ Javadoc của RuntimePermission:

Lưu ý: "exitVM *" Việc cho phép được tự động cấp cho tất cả các mã lệnh được nạp từ đường dẫn lớp ứng dụng, do đó cho phép các ứng dụng để chấm dứt bản thân.

Đọc này, có vẻ như bạn phải từ chối rõ ràng quyền này bằng cách viết SecurityManager của chính bạn. (Ví dụ: xem câu trả lời này: Prevent System.exit to actually exit the JVM)

+0

Cảm ơn, bạn tìm thấy nó !! – kiki

1

Hoặc bạn có thể thực hiện AOP và chặn System.exit. Tự làm như vậy là: tạo trình nạp lớp của riêng bạn và sử dụng BPEL để theo dõi System.exit và vá các cuộc gọi đó. Thực sự không phải là một nỗ lực lớn.

3

Theo báo cáo lỗi, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, tệp chính sách không cho phép gọi System.exit(). Tôi đang chạy một ứng dụng với Java 1.6 và vẫn thấy lỗi này mặc dù nó đã được "giải quyết". Tương tự như OP, tôi có một tệp chính sách toàn hệ thống không bao gồm quyền cho exitVM. Tuy nhiên, tôi có thể thoát khỏi ứng dụng mà không có bất kỳ ngoại lệ nào bị ném.

Sự hiểu biết của tôi về việc bao gồm tệp chính sách tùy chỉnh là tất cả các quyền đều nằm trong danh sách đen trừ những quyền được bao gồm trong tệp chính sách. Vì exitVM không được bao gồm nên không được phép (ghi đè quyền mặc định được MicSim đề cập). Nhưng đây không phải là trường hợp.

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