0

我使用“Eclipse E4 应用程序项目”向导创建了一个插件,然后添加了第二个带有模型片段的插件,该片段为 E4 应用程序的一个 PartStack 贡献了一个部件。

为此,我遵循http://www.vogella.com/articles/Eclipse4Modularity/article.html :在原始 Application.e4xmi 中设置 PartStack 的 ID,然后定义将 Part 添加到 PartStack 的 fragment.xmi。

第一次执行时一切正常,或使用新工作区执行(通过在程序参数中添加“-clearPersistedState”)。但是,当使用包含持久化 workbench.xmi 的现有工作区启动应用程序时,会出现以下错误消息:

!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt".
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.showTab(LazyStackRenderer.java:156)
at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1024)
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:98)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:639)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:725)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:696)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:690)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:675)

调试到 LazyStackRenderer.java:156 表明 getParent() 调用返回 null。

问题似乎源于重新加载持久化的 workbench.xmi,其中包括此部分(XML 小于等已删除):

...children xsi:type="basic:PartStack" xmi:id="..." elementId="demo.app.mainstack" contributorURI="platform:/plugin/E4DemoApp" selectedElement="_MG5SoMbxEeGKj8gOLKAMgw"
....children xsi:type="basic:Part" xmi:id="_MG5SoMbxEeGKj8gOLKAMgw" elementId="demo.app.added_part" contributorURI="..." contributionURI="bundleclass://..." label="Added Part"

请注意,PartStack 的“selectedElement”指向其单个子条目。在 E4Application.loadApplicationModel() 中加载该模型时,其中的“theApp”如下所示:

Window->Perspective->...->PartStackImpl->PartImpl

PartImpl.eContainer 指向 PartStackImpl。好的。

PartStackImpl.selectedElement 应该反过来引用单个封闭的 PartImpl。相反,它指的是不同的 PartImpl,即具有正确 elementId、contributorURI 和contributionURI 的对象,但对于 eContainer 为 null。

因此,持久化的 workbench.xmi 元素可以正常加载,但 selectedElement 指针指向实际模型元素的不完整副本。稍后,LazyStackRenderer 使用不完整的“selectedElement”副本,它的父级 (eContainer) 为 null,并引发 NullPointerException。

知道如何解决这个问题或解决它吗?这是针对 RCP 和 RAP 的 Eclipse 4.2。

4

1 回答 1

0

日食-开普勒。

对我来说,我去了

...\.metadata.plugins\org.eclipse.e4.workbench 文件夹位置。

并删除了所有内容

工作台.xmi

并重新启动应用程序。

为我工作,希望对我有用。

于 2014-11-27T10:31:40.320 回答