【问题标题】:Eclipse based E3 application, Switch workspace isn't working基于 Eclipse 的 E3 应用程序,切换工作区不工作
【发布时间】:2015-09-27 20:31:43
【问题描述】:

我有一个基于 Eclipse 的 e3 应用程序,其中 Switch Workspace 无法正常工作。每当我这样做时,它都会切换到同一个工作区,而不是转到新的工作区。

在调用重新启动之前,他们将 eclipse.exitdata 的系统属性设置为 -data 工作区位置作为变量。但是重新启动后,系统变量会被清除。在他们正在调用的新工作区中

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(); 中获取工作区位置。我如何以及在哪里可以更改此变量?或者有没有其他方法可以为切换工作区传递变量?切换工作区在代码中是如何工作的?

【问题讨论】:

    标签: java eclipse eclipse-rcp rcp restart


    【解决方案1】:

    http://hexapixel.com/2009/01/12/rcp-workspaces 有一个关于如何切换工作区的旧但有效的示例。

    注意:这使用内部 Eclipse API,不鼓励这样做。

    基本上做到以下几点。

    在运行时启用工作区定义,请将-data @noDefault 放入程序参数(.product 文件/运行配置)中。 (猜猜这就是你所缺少的。)

    在您的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多