簡體   English   中英

Eclipse插件:如何顯示具有自定義啟動配置和流程的啟動流程控制台?

[英]Eclipse plugin: How to show a ProcessConsole for a launch with a custom launch configuration and process?

我有一個自定義啟動配置,實現了ILaunchConfigurationDelegate 我通過DebugPlugin.newProcess創建一個新的IProcess 我也有一個自定義流程工廠,因此我得到了自定義IProcess的實例。 然后,我寫到進程的輸出流監視器:

public class MyLauncher implements ILaunchConfigurationDelegate {
    @Override
    public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
        if (monitor == null) monitor = new NullProgressMonitor();

        // launch a new process
        MyProcess process = DebugPlugin.newProcess(launch, null, configuration.getName()).getAdapter(MyProcess.class);
        if (process == null) {
            // ERROR
            throw new CoreException(new Status(Status.ERROR, MyPlugin.ID, "Process factory not configured correctly in the launch configuration"));
        }

        process.out.append("Hello, World!\n");

        process.terminate();
    }
}

一切正常,但不會發生任何事情:不會出現控制台。 我可以使自定義控制台顯示如下:

MyConsole console = /*code to make a custom console here*/;
console.activate();
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});

但這不是ProcessConsole ,這是Launch API應該提供給我的。 它不是自動執行的,它是啟動使用這種控制台的標准過程,所以我知道我必須找到一個以某種方式顯示。 它被標記為內部,所以我不認為應該手動制作。 此外, DebugUITools.getConsole始終返回null

我覺得這是因為我忘記在自定義IProcess做一些事情:

public class MyProcess implements IProcess {
    private ILaunch launch;
    private String label;
    private IStreamsProxy proxy;
    private Map<String, String> attributes;
    private boolean terminated;
    public MyOutputStream out;

    public MyProcess(ILaunch launch, String label, Map<String, String> attributes) {
        this.launch = launch;
        this.label = label;
        this.attributes = attributes;

        out = new MyOutputStream();

        proxy = new IStreamsProxy() {
            @Override
            public void write(String input) throws IOException {

            }

            @Override
            public IStreamMonitor getOutputStreamMonitor() {
                return out;
            }

            @Override
            public IStreamMonitor getErrorStreamMonitor() {
                return out;
            }
        };
    }

    @Override
    public <T> T getAdapter(Class<T> adapter) {
        if (adapter.equals(MyProcess.class)) {
            return (T) this;
        }

        return null;
    }

    @Override
    public boolean canTerminate() {
        return true;
    }

    @Override
    public boolean isTerminated() {
        return terminated;
    }

    @Override
    public void terminate() throws DebugException {
        launch.terminate();
        terminated = true;
    }

    @Override
    public String getLabel() {
        return label;
    }

    @Override
    public ILaunch getLaunch() {
        return launch;
    }

    @Override
    public IStreamsProxy getStreamsProxy() {
        return proxy;
    }

    @Override
    public void setAttribute(String key, String value) {
        attributes.put(key, value);
    }

    @Override
    public String getAttribute(String key) {
        return attributes.get(key);
    }

    @Override
    public int getExitValue() throws DebugException {
        return 0;
    }
}

public class MyOutputStream implements IStreamMonitor {
    private String contents = "";
    private List<IStreamListener> listeners = new ArrayList<>();

    @Override
    public void addListener(IStreamListener listener) {
        listeners.add(listener);
    }

    @Override
    public String getContents() {
        return contents;
    }

    @Override
    public void removeListener(IStreamListener listener) {
        listeners.remove(listener);
    }

    public void append(Object o) {
        contents += o;
        listeners.stream().forEach((l)->l.streamAppended(String.valueOf(o), this));
    }
}

因此,簡而言之,如何使ProcessConsole出現? 當您使用非標准的IProcess時,甚至可以這樣做嗎?

為了獲得正確的功能,您不應該直接實現IProcess 您應該改為擴展RuntimeProcess 它包含正確激活控制台視圖所需的所有方法。

但是,如果您希望直接實現IProcess ,則需要做一些事情:

  • 添加getLaunch().addProcess(this); 到構造函數的末尾
  • 在正確的位置(在創建,終止和更改屬性時) DebugEvent
  • 實現getAdapter以適應於接收IProcessIDebugTargetILaunchILaunchConfiguration

如果執行所有這些操作,則將在啟動IProcess時顯示ProcessConsole

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM