2017-05-23 36 views
0

我試圖運行使用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包含在其內部的實現,我假定它也會註冊該服務。這似乎並非如此。我也嘗試過,包括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。在RCP插件被激活時, org.eclipse.osgi包已經被認爲運行了......但是沒有 ExtendedLogReaderService。我是否需要找到一種安裝Felix作爲Core Runtime的方法,以使 org.eclipse.osgi能夠由框架啓動,以使 ExtendedLogReaderServiceImpl得到註冊?

我發現了很多關於如何監聽LogService的例子......我看不到如何啓動ExtendedLogService


編輯2:我可以通過註冊虛擬 ExtendedLogService實現來抑制 LogService空值問題。

回答

0

問題已得到解決(最後),現在重新審視我們的構建系統,解決方案很可能是osgi.enterprise不是Required-Bundle,這也導致我們的OSGI-JDBC服務在測試部署時無法正常工作目標平臺。

此外,我們的首要RCP插件(含Application類等)並沒有在用於生成MANIFEST.MF文件而導致一些其他問題*.bnd文件Bundle-ActivationPolicy: lazy條款。

只是爲了防止其他人遇到這樣的問題。