执行逻辑
执行逻辑
执行运行配置分为以下几步:
- 用户选择一个运行配置 ,然后点击运行(工具栏按钮或菜单栏“Run->run”)
轮询所有已注册的执行器,判断是否支持该类型
如果支持该类型,则会创建ExecutionEnvironment 对象,ExecutionEnvironment 会整合所有必须的配置然后选择对应的 ProgramRunner 执行
ProgramRunner.execute(ExecutionEnvironment environment) : 参数是执行环境。下面介绍该方法的逻辑。
ProgramRunner.execute(ExecutionEnvironment environment) 方法的执行过程,主要包括以下几步:
调用 RunProfile.getState() 方法获取 RunProfileState 对象,它包含了命令行参数,环境参数,和另外一些必要的参数
调用上一步获取到的 RunProfileState 对象的 execute() 方法,它在开始运行程序时,会在输入输出流上会绑定一个ProcessHandler 对象,并创建一个控制台(console)来显示输出内容,返回ExecutionResult 对象,ExecutionResult 对象包含了控制台(console)和程序执行器
创建在 Run 或 Debug 窗口中显示执行控制面板的 RunContentBuilder 对象
执行器
Executor 接口定义了 运行配置 的执行方式。
IntelliJ Platform 提供了3个默认的执行器,Run , Debug , 和 Run with Coverage 。每一个执行器都有对应的工具栏按钮,点击对应的工具栏按钮会执行对应的操作。
开发执行器的时候,通常不需要实现 Executor 接口。但是,如果你想集成一个profiler ,可以使用它。
运行程序
在每一个运行配置 中都存在一个 RunProfileState 对象(从RunProfile.getState() 获取),它描述了一个准备启动的进程,以及运行所需要的像命令行、当前工作文件夹、环境变量等参数。(在运行之前,为了让 运行配置 扩展和其它组件能修改配置参数,所以将 RunProfileState 单独分离出来)
CommandLineState 是 RunProfileState 接口的标准实现类,它将运行进程和控制台面板封装进了ExecutionResult ,但是它不知道该程序实际上是如何启动的。最好使用 GeneralCommandLine ,它可以设置命令行参数并执行程序。
如果你想运行基于JVM的程序,你可以使用 JavaCommandLineState ,它能很好的处理JVM的命令,处理像 classpath 之类的参数
使用 OSProcessHandler 可以监视进程的执行并捕获其输出内容。当你使用命令行或 Process 对象创建一个 OSProcessHandler 实例的时候,你需要主动调用 startNotify() 方法捕获输出内容。在 OSProcessHandler 中绑定一个 ProcessTerminatedListener 可以在控制台上打印进程的退出状态。
打印程序输出内容
使用CommandLineState 时,会自动创建一个控制台显示面板,并把它绑定到程序的输出上。你也可以自己绑定输出,例如:
TextConsoleBuilderFactory.createBuilder(project).getConsole() 创建 ConsoleView 实例
ConsoleView.attachToProcess() 把 ConsoleView 绑定到进程上
如果使用了 ANSI escape codes 设置了输出内容的颜色,ColoredProcessHandler 会解析颜色并显示到 Console 上。
可以使用 Console 过滤器(Filter ) 将输出的某些字符转为超链接。 CommandLineState.addConsoleFilters() 方法可以在 Console 上绑定过滤器(filter),如果 Console 是你手动创建的,可以使用 TextConsoleBuilder.addFilter() 绑定过滤器(filter)
IntelliJ Platform 已经提供了2个过滤器: RegexpFilter 和 UrlFilter.
使用代码运行 “运行配置”
如果你想在程序中,使用代码运行某一个 运行配置,最简单的方法是使用 ProgramRunnerUtil.executeConfiguration(RunnerAndConfigurationSettings configuration, Executor executor) :
configuration 参数可以使用 RunManager.getConfigurationSettings(ConfigurationType) 获取
executor 参数可以使用DefaultRunExecutor.getRunExecutorInstance() 或 DefaultDebugExecutor.getDebugExecutorInstance() 获取