[英]How to capture console output of Eclipse plugin with custom Launch Configuration?
[英]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
以適應於接收IProcess
, IDebugTarget
, ILaunch
和ILaunchConfiguration
如果執行所有這些操作,則將在啟動IProcess
時顯示ProcessConsole
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.