Có vẻ như rất tiếc, rằng không có cách nào để có được IEclipseContext
mà không sử dụng tiêm. Có được viết bằng một câu trả lời cho How to use eclipse 4 DI in classes that are not attached to the application model:
Vấn đề là, tuy nhiên, rằng IEclipseContext
đã cần phải được tiêm vào một lớp học mà có thể truy cập vào các đối tượng có nhu cầu tiêm.
Tuy nhiên tôi đã giải quyết được vấn đề đăng nhập và điều tôi làm, nguyên tắc hoạt động thường. Luôn luôn có một số dịch vụ cung cấp những thứ bạn cần. Nếu bạn không thể sử dụng tiêm phụ thuộc, bạn đã nhận được bằng cách nào đó (Internet và các thí nghiệm rất thường xuyên) một tên lớp dịch vụ thích hợp. Nếu bạn đã có tên lớp dịch vụ, thì bạn có thể lấy một tham chiếu cá thể từ ngữ cảnh gói. May mắn thay, bối cảnh bó có thể truy cập mà không cần sử dụng tiêm.
Quay lại vấn đề đăng nhập của chúng tôi. Lớp đang được tìm kiếm là org.osgi.service.log.LogService
:
public class Activator implements BundleActivator {
...
private static BundleContext context;
...
public static BundleContext getContext() {
return context;
}
...
public void start(BundleContext bundleContext) throws Exception {
ServiceReference<?> logser = bundleContext.getServiceReference(LogService.class);
LogService ls = (LogService)bundleContext.getService(logser);
//print an error to test it (note, that info can be below the threshold)
ls.log(LogService.LOG_ERROR, "The bundle is starting...");
Activator.context = bundleContext;
}
...
}
Et voilà!
!ENTRY eu.barbucha.rcp-experiment.kernel 4 0 2013-08-20 07:32:32.347
!MESSAGE The bundle is starting...
Đó là tất cả. Sau đó, bạn có thể lấy bối cảnh gói bằng cách sử dụng Activator.getContext()
, nếu cần thiết.
Lưu ý quan trọng: Đáng tiếc là bạn không thể giảm ngưỡng ngay bây giờ. Đối số JVM -Declipse.log.level
không ảnh hưởng đến dịch vụ nhật ký OSGI và bạn chỉ đang sử dụng trình ghi nhật ký OSGI. Thật không may là họ (có thể tạm thời) đã mã hóa ngưỡng đăng nhập (xem How to log warnings and infos in eclipse 3.7). Tôi phát hiện ra rằng họ chưa sửa chữa nó. Không có trong bản phát hành Kepler. Tuy nhiên bạn có thể thỏa hiệp. Bạn có thể làm điều đó injection-way, nếu có thể.
giải pháp cuối cùng (để bắt ngoại lệ trên toàn cầu cũng)
tôi mở rộng hoạt của tôi:
ServiceReference<?> logreser = bundleContext.getServiceReference(LogReaderService.class);
LogReaderService lrs = (LogReaderService) bundleContext.getService(logreser);
lrs.addLogListener(new LogListener() {
@Override
public void logged(LogEntry entry) {
System.err.println("Something was logged: " + entry.getMessage());
}
});
Các văn bản bắt đầu với Something đã đăng thực sự xuất hiện, whenewer được một cái gì đó ở đâu đó đăng nhập. Nhưng lợi thế là, lớp này là của tôi. Tôi có thể kiểm soát nó. Mục nhật ký cũng chứa cấp độ. Tôi cũng có thể dễ dàng thiết lập ngưỡng. Ví dụ trên dòng lệnh.
nào _specialized_ thực sự có ý nghĩa gì? Tôi đã thử nó, nhưng không có trường hợp nào của lớp 'org.eclipse.e4.core.services.Logger' int 'IEclipseContext' chuyên biệt này, được đề cập như thế nào [trên trang wiki này] (http: //wiki.eclipse. org/E4/EAS/Logging_and_Tracing). Nếu tôi hiểu tốt, nó không thể được. Chỉ có OSGI logger cho những thứ cấp thấp như kích hoạt và vân vân. –
Nó 'chuyên' bởi vì nó chỉ chứa các dịch vụ OSGi chứ không phải những thứ khác thường được tìm thấy trong ngữ cảnh. Nó chứa LogService và LogReaderService –
Vâng, bạn nói đúng. Chỉ có các dịch vụ OSGI, bởi vì người kích hoạt là vấn đề của cấp OSGI. –