基于Eclipse的E3应用程序,Switch工作区不起作用

时间:2015-09-18 12:26:43

标签: java eclipse eclipse-rcp rcp restart

我有一个基于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();中获取工作区位置。如何以及在何处更改此变量?或者还有其他方法可以为开关工作区传递变量吗?交换机工作区如何在代码中工作?

1 个答案:

答案 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.ChooseWorkspaceDataorg.eclipse.ui.internal.ide.ChooseWorkspaceDialog