ExtendedLogService似乎没有启动

时间:2017-05-23 23:04:54

标签: java osgi eclipse-rcp equinox bndtools

我试图在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 中找到,我正在使用它启动应用程序。但是,无论出于何种原因,该服务为null,这会导致许多插件在记录时抛出异常,因为许多插件依赖于从Activator获取Logging服务。

由于 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:我可以通过注册虚拟LogService实现来抑制ExtendedLogService空值问题。

1 个答案:

答案 0 :(得分:0)

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

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

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