CS-Studio 4.4.1 + Debian 10 机器上的 Tango Controls:GUI 失败并显示 SWTException 和 NoClassDefFoundError,可能已弃用 Corba 类

问题描述

所以...我正在尝试使用 CSS 来构建 GUI 来控制 Linux 服务器中的 Tango 设备。运行非常简单的 GUI(仅从仪器读取电压并在显示器上更新)时,GUI 会运行,但过程变量“断开连接”,即使语法正确。

启动 GUI 时,控制台给我以下错误

SEVERE [Thread 1] org.csstudio.logging.PluginLogListener (logging) - Unhandled event loop exception
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NoClassDefFoundError: org/omg/CORBA/UserException)
    at org.eclipse.swt.SWT.error(SWT.java:4491)
    at org.eclipse.swt.SWT.error(SWT.java:4406)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncmessages(Synchronizer.java:138)
    at org.eclipse.swt.widgets.display.runAsyncmessages(display.java:3794)
    at org.eclipse.swt.widgets.display.readAnddispatch(display.java:3433)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1127)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:694)
    ...
Caused by: java.lang.NoClassDefFoundError: org/omg/CORBA/UserException
    at java.base/java.lang.classLoader.defineClass1(Native Method)
    at java.base/java.lang.classLoader.defineClass(ClassLoader.java:1017)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:272)
    ...
Caused by: java.lang.classNotFoundException: org.omg.CORBA.UserException cannot be found by tangorb-jacorbfree_9.2.2
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
    ... 62 more

关闭GUI窗口时出现以下错误

SEVERE [Thread 1] org.csstudio.logging.PluginLogListener (logging) - Error disposing widget for : org.eclipse.e4.ui.model.application.ui.basic.impl.PartImpl OPI View
java.lang.NullPointerException
    at org.csstudio.opibuilder.editparts.AbstractBaseEditPart.deactivate(AbstractBaseEditPart.java:315)
    at org.csstudio.opibuilder.editparts.AbstractContainerEditpart.deactivate(AbstractContainerEditpart.java:291)
    at org.csstudio.opibuilder.editparts.displayeditpart.deactivate(displayeditpart.java:181)
    at org.eclipse.gef.editparts.AbstractEditPart.deactivate(AbstractEditPart.java:293)
    at org.eclipse.gef.editparts.AbstractGraphicalEditPart.deactivate(AbstractGraphicalEditPart.java:354)
    at org.eclipse.gef.ui.parts.AbstractEditPartViewer.unhookControl(AbstractEditPartViewer.java:768)
    at org.eclipse.gef.ui.parts.GraphicalViewerImpl.unhookControl(GraphicalViewerImpl.java:442)
    at org.eclipse.gef.ui.parts.AbstractEditPartViewer.setControl(AbstractEditPartViewer.java:634)
    at org.eclipse.gef.ui.parts.AbstractEditPartViewer.handledispose(AbstractEditPartViewer.java:222)
    at org.eclipse.gef.ui.parts.GraphicalViewerImpl.handledispose(GraphicalViewerImpl.java:109)
    at org.eclipse.gef.ui.parts.AbstractEditPartViewer$2.widgetdisposed(AbstractEditPartViewer.java:436)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:123)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.display.sendEvent(display.java:4481)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1353)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1334)
    at org.eclipse.swt.widgets.Widget.release(Widget.java:1138)
    at org.eclipse.swt.widgets.Control.release(Control.java:3814)
    at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:1376)
    at org.eclipse.swt.widgets.Widget.release(Widget.java:1141)
    at org.eclipse.swt.widgets.Control.release(Control.java:3814)
    at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:1376)
    at org.eclipse.swt.widgets.Widget.release(Widget.java:1141)
    at org.eclipse.swt.widgets.Control.release(Control.java:3814)
    at org.eclipse.swt.widgets.Widget.dispose(Widget.java:478)
    at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.disposeWidget(SWTPartRenderer.java:177)
    at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.disposeWidget(ContributedPartRenderer.java:272)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:914)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:842)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$3.run(PartRenderingEngine.java:837)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    ...

当我用谷歌搜索时,(我相信)我已经可以排除一些常见的情况了:

  1. gtk 3 的问题:我的 cs-studio ini 文件有这行强制使用 gtk 2。

  2. 错误java类路径:检查CSS的安装细节/配置,java类路径设置正确。

现在,以下两种情况的可能性更大:

  1. JDK 8(2012 年发布)后弃用的 CORBA 类:似乎在 JDK 8 之后删除了一些 corba 类定义,可能会影响任何依赖项的调用。嗯,这是可能的,但是这些 GUI 是在 2018 年之后在 JDK 11 中开发和使用的(尽管在带有本地仪器的 Windows 机器上,现在我正在 Debian 10 机器上尝试远程探戈服务​​器)。为什么此时它仍要调用已弃用的 corba 类?

  2. 插件文件夹中缺少与SWT相关的*.jar文件:检查这些文件时,我只找到org.eclipse.swt.gtk.linux.x86_64_3.104.2.v20160212-1350 .jarorg.eclipse.swt_3.104.2.v20160212-1350.jar。但是(来自:Eclipse FAQ):

问:为什么我会收到错误java.lang.NoClassDefFoundError: org/eclipse/swt/internal/XXX/OS.”? A:在一些平台如 GTK 上,SWT 被分解成多个 jar。因此,您必须确保所有必需的 jar 都在类路径上。所需的罐子是:

   swt.jar (all platforms)
   swt-pi.jar (some platforms like GTK and Carbon)
   swt-mozilla.jar (for browser widget on GTK and Motif)
   swt-gtk.jar (on Linux Motif)

到目前为止我还没有找到如何下载这些文件。任何人? 无论如何,这可能吗?有没有人遇到过这些问题?

感谢您的帮助。

干杯!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)