我有一个基于Eclipse的e3应用程序,其中Switch Workspace没有正常工作。每当我这样做时,它会切换到相同的工作区而不会转到新工作区。
在调用restart之前,他们正在为eclipse.exitdata设置一个System属性-data workspace location作为变量。但重新启动后,System变量被清除。在新工作区中,他们正在调用
PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
从内部获取InternalPlatform类位置变量的位置。 InternalPlatform是一个.class文件,我没有权限编辑它。在InternalPlatform中,这是代码
public Location getInstanceLocation() {
assertInitialized();
return (Location) instanceLocation.getService();
}
/**
* @see Platform#getLocation()
*/
public IPath getLocation() throws IllegalStateException {
if (cachedInstanceLocation == null) {
Location location = getInstanceLocation();
if (location == null)
return null;
// This makes the assumption that the instance location is a file: URL
File file = new File(location.getURL().getFile());
cachedInstanceLocation = new Path(file.toString());
}
return cachedInstanceLocation;
}
在此Location location = getInstanceLocation();
中获取工作区位置。如何以及在何处更改此变量?或者还有其他方法可以为开关工作区传递变量吗?交换机工作区如何在代码中工作?
答案 0 :(得分:1)
关于如何在http://hexapixel.com/2009/01/12/rcp-workspaces切换工作区,有一个古老而又有效的例子。
注意:这使用内部Eclipse API,不鼓励使用。
基本上做以下几点。
要在运行时启用工作空间定义,请将-data @noDefault
放在程序参数(.product file / run config)中。 (猜猜这就是你所缺少的。)
在Application.java
(或任何你的名字)中,你可以简单地执行此操作:
try {
Location instanceLoc = Platform.getInstanceLocation();
instanceLoc.set(new URL("file", null, "/home/temp"), false);
}
catch (Exception err) {
// Do something meaningful with the exception
}
这样您就可以手动设置工作区(例如,用于测试目的)。
要重新使用 Eclipse对话框,请按以下方式实施Application
。
public class Application implements IApplication {
public Object start(IApplicationContext context) {
Display display = PlatformUI.createDisplay();
Location instanceLoc = Platform.getInstanceLocation();
boolean isWorkspaceSelected = false;
try {
URL url = new File(System.getProperty(“user.home”), “workspace”).toURI().toURL();
ChooseWorkspaceData data = new ChooseWorkspaceData(url);
ChooseWorkspaceDialog dialog = new ChooseWorkspaceDialog(display.getActiveShell(), data, true, true);
dialog.prompt(true);
String selection = data.getSelection();
if (selection != null) {
isWorkspaceSelected = true;
data.writePersistedData();
url = new File(selection).toURI().toURL();
instanceLoc.set(url, false);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
try {
if (isWorkspaceSelected) {
int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor(display));
if (returnCode == PlatformUI.RETURN_RESTART) {
return IApplication.EXIT_RESTART;
}
}
return IApplication.EXIT_OK;
} finally {
display.dispose();
}
}
}
请注意:它使用内部API ,即org.eclipse.ui.internal.ide.ChooseWorkspaceData
和org.eclipse.ui.internal.ide.ChooseWorkspaceDialog
。