ExtendedLogService 似乎没有启动

ExtendedLogService does not appear to start

我正在尝试 运行 一个 Eclipse 3.x 应用程序,该应用程序使用 中启动的 Neon 中的 Equinox。

看来我剩下的问题是 LogReaderService 似乎不可用,因为下面的第二行 org.eclipse.core.internal.runtime.InternalPlatform.getLog() 似乎抛出 NullPointerException:

ExtendedLogReaderService logReader = logReaderTracker.getService();
logReader.addLogListener(result, result);

这个 class 的实现可以在 org.eclipse.osgi 中找到,我用它来启动应用程序。但是,无论出于何种原因,该服务为 null,这导致许多插件在记录日志时抛出异常,因为许多插件依赖于从 Activator 获取日志记录服务。

由于 org.eclipse.osgi 在其内部包含实现,我假设它也会注册该服务。情况似乎并非如此。我也试过包括 log4jorg.apache.felix.log 但似乎都没有解决这个问题。

这里肯定缺少一些简单的东西来启动日志服务?这是堆栈跟踪:

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.run(BundleContextImpl.java:774)
at org.eclipse.osgi.internal.framework.BundleContextImpl.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 Framework 在 bnd运行 文件中设置为 org.eclipse.osgi,是否阻止了日志记录正在初始化?我也尝试添加 org.apache.commons.logging 以及 osgi.enroute.equinox.log.adapter 并且当任何尝试记录时我仍然收到 NPE。当 RCP 插件被激活时,org.eclipse.osgi 包已经被认为是 运行ning...但是没有 ExtendedLogReaderService.我是否需要找到一种方法将 Felix 安装为核心运行时,以使 org.eclipse.osgi 能够通过框架启动,以便 ExtendedLogReaderServiceImpl 要注册吗?

我找到了很多关于如何侦听 LogService 的示例...我没有看到如何启动 ExtendedLogService


编辑 2:我可以通过注册虚拟 ExtendedLogService 实现来抑制 LogService 空值问题。

问题已经解决(终于),既然我们的构建系统已经到位,请重新审视这个问题,解决方案很可能是 osgi.enterprise 不是 Required-Bundle,这也导致了我们的 OSGI-JDBC 测试部署的目标平台时服务无法正常工作。

此外,我们的主要 RCP plug-in(包含 Application class 等)在 *.bnd 文件中没有 Bundle-ActivationPolicy: lazy 子句用于生成导致一些其他问题的 MANIFEST.MF 文件。

以防其他人遇到此类问题。