Eclipse E4 RCP 应用程序和动态服务
Eclipse E4 RCP application and Dynamic Services
我正在将 RCP 应用程序从 3.7 (Indigo) 框架升级到 4.4 (Luna) 框架。该应用程序在 3.7 中正常工作,但在 4.4 中失败并显示 org.eclipse.swt.SWTException:线程访问无效。
存在启动应用程序服务以提供对数据库的访问的动态服务 (DS)。当我从清单中删除 DS 引用时,应用程序将启动,但没有 DS 将无法完全运行。
迄今为止,我已尝试更改创建和使用 DS 的捆绑包的启动顺序/优先级,但这并没有解决问题。
关于如何继续进行故障排除和解决此问题的任何建议?
更新
通过错误跟踪,在方法 Display.checkDevice() 中创建 E4 workbench 时失败。
完整堆栈跟踪
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4441)
at org.eclipse.swt.SWT.error(SWT.java:4356)
at org.eclipse.swt.SWT.error(SWT.java:4327)
at org.eclipse.swt.widgets.Display.error(Display.java:1258)
at org.eclipse.swt.widgets.Display.checkDevice(Display.java:764)
at org.eclipse.swt.widgets.Display.getHighContrast(Display.java:1864)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application.setCSSContextVariables(E4Application.java:327)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:305)
at org.eclipse.ui.internal.Workbench.run(Workbench.java:601)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at com.easa.acmotor.base.Application.start(Application.java:24)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
该问题与动态服务无关。
经过几次长时间的调试会话后,通过在 Display 对象的构造函数中放置一个中断来确定根本原因。这使我们能够在其中一个执行 Display.getDefault() 的插件的 Activator 中找到一些非常古老的代码。在 3.7 中,Activator 在 Display 初始化后被调用,在 4.4 中,这个时间发生了变化,因此 Activator 在应用程序初始化 Display 之前被调用。
我正在将 RCP 应用程序从 3.7 (Indigo) 框架升级到 4.4 (Luna) 框架。该应用程序在 3.7 中正常工作,但在 4.4 中失败并显示 org.eclipse.swt.SWTException:线程访问无效。
存在启动应用程序服务以提供对数据库的访问的动态服务 (DS)。当我从清单中删除 DS 引用时,应用程序将启动,但没有 DS 将无法完全运行。
迄今为止,我已尝试更改创建和使用 DS 的捆绑包的启动顺序/优先级,但这并没有解决问题。
关于如何继续进行故障排除和解决此问题的任何建议?
更新
通过错误跟踪,在方法 Display.checkDevice() 中创建 E4 workbench 时失败。
完整堆栈跟踪
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4441)
at org.eclipse.swt.SWT.error(SWT.java:4356)
at org.eclipse.swt.SWT.error(SWT.java:4327)
at org.eclipse.swt.widgets.Display.error(Display.java:1258)
at org.eclipse.swt.widgets.Display.checkDevice(Display.java:764)
at org.eclipse.swt.widgets.Display.getHighContrast(Display.java:1864)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application.setCSSContextVariables(E4Application.java:327)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:305)
at org.eclipse.ui.internal.Workbench.run(Workbench.java:601)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at com.easa.acmotor.base.Application.start(Application.java:24)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
该问题与动态服务无关。
经过几次长时间的调试会话后,通过在 Display 对象的构造函数中放置一个中断来确定根本原因。这使我们能够在其中一个执行 Display.getDefault() 的插件的 Activator 中找到一些非常古老的代码。在 3.7 中,Activator 在 Display 初始化后被调用,在 4.4 中,这个时间发生了变化,因此 Activator 在应用程序初始化 Display 之前被调用。