我试图运行使用Equinox in Neon的Eclipse 3.x应用程序,如在this question中启动的那样。ExtendedLogService似乎并未启动
看来,我剩下的问题是,LogReaderService似乎不可用,如org.eclipse.core.internal.runtime.InternalPlatform.getLog(下面第二行)似乎抛出NullPointerException异常:
ExtendedLogReaderService logReader = logReaderTracker.getService();
logReader.addLogListener(result, result);
此类的实现可以在org.eclipse.osgi,这我启动与应用程序被发现。但是,无论出于何种原因,该服务都是空的,这会导致大量插件在记录时引发异常,因为许多插件依赖于从Activator获取记录服务。
由于org.eclipse.osgi包含在其内部的实现,我假定它也会注册该服务。这似乎并非如此。我也尝试过,包括log4j和org.apache.felix.log并且都不会解决此问题。
必须有一些简单的东西,在这里失踪让LogService开始?这里的堆栈跟踪:
Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle org.eclipse.core.resources (44).
at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345)
at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:419)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 20 more
Caused by: org.osgi.framework.BundleException: Exception in org.eclipse.core.resources.ResourcesPlugin.start() of bundle org.eclipse.core.resources.
at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795)
at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724)
at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932)
at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309)
at org.eclipse.osgi.container.Module.doStart(Module.java:581)
at org.eclipse.osgi.container.Module.start(Module.java:449)
at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470)
at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)
... 29 more
Caused by: java.lang.NullPointerException
at org.eclipse.core.internal.runtime.InternalPlatform.getLog(InternalPlatform.java:353)
at org.eclipse.core.runtime.Platform.getLog(Platform.java:976)
at org.eclipse.core.internal.utils.Policy.log(Policy.java:159)
at org.eclipse.core.internal.resources.Workspace.setCrashed(Workspace.java:2302)
at org.eclipse.core.internal.resources.SaveManager.restoreSnapshots(SaveManager.java:963)
at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:720)
at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1587)
at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2399)
at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2156)
at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:464)
at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774)
at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767)
... 36 more
我还添加了
Require-Capability: osgi.service;filter:="(objectClass=org.osgi.service.log.LogService)";effective:=active
要依赖BND文件之一。这似乎没有解决问题。
编辑:因为OSGi框架在 bndrun文件设置为 org.eclipse.osgi,是防止日志得到初始化?我也尝试加入 org.apache.commons.logging以及 osgi.enroute.equinox.log.adapter当我有任何尝试登录时,我仍然会收到NPE。在RCP插件被激活时, org.eclipse.osgi包已经被认为运行了......但是没有 ExtendedLogReaderService。我是否需要找到一种安装Felix作为Core Runtime的方法,以使 org.eclipse.osgi能够由框架启动,以使 ExtendedLogReaderServiceImpl得到注册?
我发现了很多关于如何监听LogService的例子......我看不到如何启动ExtendedLogService。
编辑2:我可以通过注册虚拟
ExtendedLogService
实现来抑制
LogService
空值问题。