我有一个自定义启动配置,实现ILaunchConfigurationDelegate
。我通过IProcess
创建了一个新的DebugPlugin.newProcess
。我也有自定义流程工厂,因此我获得了自定义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
时,是否可以执行此操作?
答案 0 :(得分:0)
要为您的流程获取正确的功能,您不应直接实施IProcess
;你应该扩展RuntimeProcess
。它具有正确激活控制台视图所需的所有方法。
但是,如果您希望直接实施IProcess
,则需要执行以下操作:
getLaunch().addProcess(this);
添加到构造函数的末尾DebugEvent
(创建,终止和更改属性)getAdapter
以适应接收IProcess
,IDebugTarget
,ILaunch
和ILaunchConfiguration
如果您执行了所有这些操作,则在启动ProcessConsole
时会显示IProcess
。