7

我遇到了 Eclipse 4 RCP 应用程序的一个问题。我需要记录一些事件。我需要以某种方式获得对记录器的引用。我知道,如何使用 来做到这一点IEclipseContext,但我无处可寻,如何在IEclipseContext没有依赖注入的情况下获得,我不能在激活器中使用它。请问有大神知道怎么解决这个问题吗?

非常感谢

4

3 回答 3

6

您可以IEclipseContext通过调用获得一个EclipseContextFactory.getServiceContext(bundleContext)允许访问 OSGi 服务的专业。

于 2013-08-20T11:17:57.970 回答
4

似乎很遗憾,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是某处记录的东西时。但最大的好处是,这门课是我的。我可以控制它。日志条目还包含级别。我还可以轻松设置阈值。例如在命令行上。

于 2013-08-20T05:54:16.913 回答
2

可以从服务中获取“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);
    }
}
于 2015-10-20T07:39:26.917 回答