我遇到了 Eclipse 4 RCP 应用程序的一个问题。我需要记录一些事件。我需要以某种方式获得对记录器的引用。我知道,如何使用 来做到这一点IEclipseContext
,但我无处可寻,如何在IEclipseContext
没有依赖注入的情况下获得,我不能在激活器中使用它。请问有大神知道怎么解决这个问题吗?
非常感谢
我遇到了 Eclipse 4 RCP 应用程序的一个问题。我需要记录一些事件。我需要以某种方式获得对记录器的引用。我知道,如何使用 来做到这一点IEclipseContext
,但我无处可寻,如何在IEclipseContext
没有依赖注入的情况下获得,我不能在激活器中使用它。请问有大神知道怎么解决这个问题吗?
非常感谢
您可以IEclipseContext
通过调用获得一个EclipseContextFactory.getServiceContext(bundleContext)
允许访问 OSGi 服务的专业。
似乎很遗憾,IEclipseContext
不使用注射就无法获得。在未附加到应用程序模型的类中如何使用 eclipse 4 DI的答案中写有:
然而,问题在于,
IEclipseContext
已经需要将其注入到可以访问需要注入的对象的类中。
不过我已经解决了日志记录的问题和我的事情,原理一般。总有一些服务可以提供您需要的东西。如果你不能使用依赖注入,你必须以某种方式(互联网和实验经常)获得一个合适的服务类名称。如果您已获得服务类名称,则可以从捆绑上下文中获取实例引用。幸运的是,无需使用注入即可访问包上下文。
回到我们的日志记录问题。正在搜索的类是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;
}
...
}
瞧!
!ENTRY eu.barbucha.rcp-experiment.kernel 4 0 2013-08-20 07:32:32.347
!MESSAGE The bundle is starting...
就这样。Activator.getContext()
稍后,如果需要,您可以使用 获取捆绑上下文。
重要提示:很遗憾,您现在无法降低阈值。JVM 参数-Declipse.log.level
不影响 OSGI 日志服务,您现在只使用 OSGI 记录器。不幸的是,他们(可能暂时)对日志阈值进行了硬编码(请参阅如何在 eclipse 3.7 中记录警告和信息)。我发现,他们还没有修复它。在开普勒版本中也没有。但是,您可以做出妥协。您可以在可能的情况下进行这种注入方式。
最终解决方案(也可以全局捕获异常)
我扩展了我的激活器:
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());
}
});
以Something was logged开头的文本确实出现了,当ewer是某处记录的东西时。但最大的好处是,这门课是我的。我可以控制它。日志条目还包含级别。我还可以轻松设置阈值。例如在命令行上。
可以从服务中获取“WorkbenchContext” IWorkbench
:
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.ui.PlatformUI;
public final class EclipseContextHelper {
public static IEclipseContext getActiveContext(){
IEclipseContext context = getWorkbenchContext();
return context == null ? null : context.getActiveLeaf();
}
public static IEclipseContext getWorkbenchContext(){
return PlatformUI.getWorkbench().getService(IEclipseContext.class);
}
}