【问题标题】:ExtendedLogService does not appear to startExtendedLogService 似乎没有启动
【发布时间】:2017-10-24 02:11:44
【问题描述】:

我正在尝试使用this question 中启动的 Neon 中的 Equinox 运行 Eclipse 3.x 应用程序。

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

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

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

由于 org.eclipse.osgi 在其内部包含实现,我假设它也会注册服务。情况似乎并非如此。我也尝试过包含 log4jorg.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。 org.eclipse.osgi 包在 RCP 插件被激活时已经被认为正在运行......但是没有 ExtendedLogReaderService。我是否需要找到一种方法将 Felix 安装为核心运行时以使 org.eclipse.osgi 能够由框架启动,以便 ExtendedLogReaderServiceImpl 能够注册?

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


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

【问题讨论】:

    标签: java osgi eclipse-rcp equinox bndtools


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多