Starting an ApplicationConfiguration without invoking before Build Project
Hi,
I'm trying to create dynamic run configuration and invoke it from within an action, but unfortunately, invoking the run configuration always triggers compilation of the whole project. Whenever I have compile failures on other parts of the project, my run configuration isn't invoked, and the compilation errors are shown.
The class with the main()-method comes from a dependency that is included in the classpath. This works very well, but a compilation error has no impact on the tool I'm going to invoke, so there is no need to stop on errors.
I'm looking basically for an option to disable the automatic build, but I don't know where to look. Here is what I've tried so far:
public class MyCustomLaunchAction extends AnAction {
private ConfigurationFactory myConfigurationFactory = new ConfigurationFactoryEx(ApplicationConfigurationType.getInstance()) {
@Override
public RunConfiguration createConfiguration(String name, RunConfiguration template) {
System.out.println("MyCustomLaunchAction.createConfiguration");
return new ApplicationConfiguration(name, template.getProject(), ApplicationConfigurationType.getInstance()) {
@Override
public boolean isCompileBeforeLaunchAddedByDefault() {
System.out.println("MyConfig.isCompileBeforeLaunchAddedByDefault"); //doesn't work, isn't called
return false;
}
};
}
@NotNull
@Override
public RunConfiguration createTemplateConfiguration(@NotNull Project project) {
System.out.println("MyCustomLaunchAction.createTemplateConfiguration");
return createConfiguration("MyConfig",
ApplicationConfigurationType.getInstance().getConfigurationFactories()[0].createTemplateConfiguration(project));
}
};
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = e.getProject();
if (project == null) return;
final ConfigurationFactory applicationsConfigFactory = ApplicationConfigurationType.getInstance().getConfigurationFactories()[0];
final RunnerAndConfigurationSettings bar = RunManager.getInstance(project).createConfiguration(
"EditCurrentFile", myConfigurationFactory);
final ApplicationConfiguration myApplicationConfiguration = (ApplicationConfiguration) bar.getConfiguration();
myApplicationConfiguration.setModule(ModuleManager.getInstance(project).findModuleByName("myModule"));
myApplicationConfiguration.setMainClassName("main.class.from.dependency.Main");
final VirtualFile currentFile = getCurrentFile(project);
final String params = currentFile == null ? "" : currentFile.getCanonicalPath();
System.out.println("params = " + params);
myApplicationConfiguration.setProgramParameters(params);
myApplicationConfiguration.setVMParameters("-Dstartgui=true -Ddb=${jdbcurl}");
myApplicationConfiguration.setPassParentEnvs(true);
myApplicationConfiguration.setWorkingDirectory("$MODULE_DIR$");
myApplicationConfiguration.setBeforeRunTasks(Collections.emptyList()); //does not work
//Disable make before run
// RunManagerEx.disableTasks(project, myApplicationConfiguration, CompileStepBeforeRun.ID); //Does also not work
RunManagerEx.getInstanceEx(project).getBeforeRunTasks(myApplicationConfiguration).get(0).setEnabled(false); //Also does not
final Executor runExecutorInstance = DefaultRunExecutor.getRunExecutorInstance();
// runExecutorInstance.
ProgramRunnerUtil.executeConfiguration(project, bar, runExecutorInstance);
}
private @Nullable VirtualFile getCurrentFile(final Project project) {
Editor selectedTextEditor = FileEditorManager.getInstance(project).getSelectedTextEditor();
if (selectedTextEditor == null) {
return null;
}
Document currentDoc = selectedTextEditor.getDocument();
return FileDocumentManager.getInstance().getFile(currentDoc);
}
}
Thanks in advance!
Please sign in to leave a comment.
Please check if template run configuration of 'Application' type has before run task 'Make'. 'Make' comes from template to real configuration and you should change the template OR disable before run task of your 'dynamic' run configuration.
Thank you very much for your fast reply and your hint with the template configurations. Apparently, the RunManager uses the ConfigurationType to create a template configuration, so he can retrieve the Tasks to be executed before launch. When I create my own type, it works ;)
public class MyCustomLaunchAction extends AnAction {
private class MyConfigurationType extends ApplicationConfigurationType {
private ConfigurationFactory myConfigurationFactory = new ConfigurationFactoryEx(this) {
@NotNull
@Override
public RunConfiguration createTemplateConfiguration(@NotNull Project project) {
//second parameter is used to pass the project
return createConfiguration("MyConfig",
ApplicationConfigurationType.getInstance().getConfigurationFactories()[0].createTemplateConfiguration(project));
}
@Override
public RunConfiguration createConfiguration(String name, RunConfiguration template) {
return new ApplicationConfiguration(name, template.getProject(), this) {
@Override
public boolean isCompileBeforeLaunchAddedByDefault() {
return false;
}
// @Override //Not yet available in 2017.2,
// public boolean isBuildBeforeLaunchAddedByDefault() {
// System.out.println("legacy.MyCustomLaunchAction.isBuildBeforeLaunchAddedByDefault");
// return true;
// }
};
}
@Override
public void onNewConfigurationCreated(@NotNull RunConfiguration configuration) {
((ModuleBasedConfiguration) configuration).onNewConfigurationCreated();
}
};
@Override
public String getDisplayName() {
return "ConfigWithoutCompile";
}
@Override
public ConfigurationFactory[] getConfigurationFactories() {
return new ConfigurationFactory[]{myConfigurationFactory};
}
@NotNull
@Override
public String getId() {
return "ConfigWithoutCompile";
}
}
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = e.getProject();
if (project == null) return;
final MyConfigurationType myConfigurationType = new MyConfigurationType();
final ConfigurationFactory myConfigurationFactory = myConfigurationType.getConfigurationFactories()[0];
final RunnerAndConfigurationSettings bar = RunManager.getInstance(project).createConfiguration(
myConfigurationFactory.createTemplateConfiguration(project), myConfigurationFactory);
final ApplicationConfiguration myApplicationConfiguration = (ApplicationConfiguration) bar.getConfiguration();
myApplicationConfiguration.setModule(ModuleManager.getInstance(project).findModuleByName("myModule"));
myApplicationConfiguration.setMainClassName("jdk.nashorn.tools.Shell");
final VirtualFile currentFile = getCurrentFile(project);
final String params = currentFile == null ? "" : currentFile.getCanonicalPath();
myApplicationConfiguration.setProgramParameters(params);
myApplicationConfiguration.setVMParameters("-Dstartgui=true -Ddb=${jdbcurl}");
myApplicationConfiguration.setPassParentEnvs(true);
myApplicationConfiguration.setWorkingDirectory("$MODULE_DIR$");
final Executor runExecutorInstance = DefaultRunExecutor.getRunExecutorInstance();
ProgramRunnerUtil.executeConfiguration(project, bar, runExecutorInstance);
}
private @Nullable VirtualFile getCurrentFile(final Project project) {
Editor selectedTextEditor = FileEditorManager.getInstance(project).getSelectedTextEditor();
if (selectedTextEditor == null) {
return null;
}
Document currentDoc = selectedTextEditor.getDocument();
return FileDocumentManager.getInstance().getFile(currentDoc);
}
}
Thanks a lot!