2010-11-15 37 views
16

Tôi đang gặp một chút rắc rối với một số mã Java mà tôi đang cố gắng biên dịch trong Eclipse. Tôi tiếp tục nhận được cảnh báo sau đây ...Tại sao quyền truy cập bị hạn chế vào jre6/lib/rt.jar đối với OperatingSystemMxBean?

Access restriction: The type OperatingSystemMXBean is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar 

Từ dòng mã này ...

com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 

tôi đã tìm thấy cách khoảng này nhưng tôi lo lắng về cảnh báo hạn chế. Mã này dành cho dự án nguồn mở của tôi (CfTracker) và tôi không muốn giải quyết hạn chế này nếu tôi sắp phá vỡ một số thỏa thuận cấp phép. Bất cứ ai có thể giúp tôi hiểu điều này?

Trả lời

13

Đây không phải là vấn đề về thỏa thuận cấp phép. Nó chỉ là Eclipse đang cố gắng bảo vệ bạn khỏi việc sử dụng các lớp không phải là một phần của API JDK chính thức (mà đúng hơn là một phần của việc triển khai JVM của Oracle/Sun).

Có lý do cụ thể nào mà bạn cần phải bỏ lớp (thay vì sử dụng the "official" interface java.lang.management.OperatingSystemMXBean)?

Nếu bạn muốn đảm bảo rằng ứng dụng của bạn tiếp tục chạy khi MXBean dự kiến ​​không có sẵn, bạn có thể thêm một số logic try/catch để xử lý một cách thủ công một ClassCastException.

+0

Cảm ơn Thilo. Điều đó xóa nó cho tôi. Tôi đã đúc nó để có được phương thức getProcessCpuTime() có trong thực thi Oracle/Sun. Tôi mới sử dụng Java nên không biết đó không phải là một API chính thức. Tôi sẽ xem xét bằng cách sử dụng một thử bắt mặc dù điều đó làm cho rất nhiều ý nghĩa nếu nó sẽ không được có tất cả các thời gian :) cổ vũ! –

+0

Tôi nghĩ tốt hơn là ghi đè tùy chọn này ở cấp cài đặt dự án. – user626528

13

Đi tới cửa sổ -> Tùy chọn -> Java -> Trình biên dịch -> Lỗi/Cảnh báo. Chọn API không được chấp nhận và bị hạn chế. Thay đổi nó thành cảnh báo. Thay đổi cấm và khuyến khích tham khảo và thay đổi nó để cảnh báo. (hoặc theo nhu cầu của bạn.)

Cảm ơn.

9

Giải pháp tốt nhất tôi tìm thấy cho một này là:

  • Tới các thiết lập Build Path trong các thuộc tính của dự án.

  • Xóa Thư viện hệ thống JRE

  • Thêm lại; Chọn "Thêm Thư viện" và chọn Thư viện Hệ thống JRE.

https://stackoverflow.com/a/2174607/1572446

+0

Tôi chỉ tình cờ gặp phải vấn đề này và cố gắng giải quyết vấn đề của mình. Siêu dễ dàng và không có lộn xộn đặc biệt-trường hợp cấu hình. Cảm ơn! – RNGuy

1

Ở đây nó được giải thích Why Developers Should Not Write Programs That Call 'sun' Packages.

Giải pháp thay thế được sử dụng bởi OrientDB here là sự phản ánh.

Như một ví dụ:

try { 
    OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); 
    if (Class.forName("com.sun.management.OperatingSystemMXBean").isInstance(os)) { 
     Method memorySize = os.getClass().getDeclaredMethod("getTotalPhysicalMemorySize"); 
     memorySize.setAccessible(true); 
     return (Long) memorySize.invoke(os); 
    } 
} catch (Exception e) { 
} 
Các vấn đề liên quan