![](/img/trans.png)
[英]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.