Small tutorial for running external tools programmatically with eclipse
Last couple of day I had to refactor code for an eclipse plugin.The source code to modify rely on java runtime exec to launch a temporary maven project. This code works fine but the process launched does not log in eclipse console.
So at this point I look for a way to launch this maven build, external to the workspace as the eclipse menu "launch external tool does". After a few search on the web I found a way to be able to do this:
- create a launch configuration
- save it in a file
- build the same setup in source code
- and finally launch the configuration
First thing to do : create an external tool configuration...
You should find a file in the root folder project named : New_configuration.launch.
Now when editing this file I have all the parameters needed to write my code :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION"
value="${system_path:mvn.bat}"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"
value="-Dlogback.configurationFile=customlogback.xml -U clean install exec:java"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY"
value="D:\DONNEES\FDS_DATA\genDoc"/>
</launchConfiguration>
With this content and this address I could now write the source code that allow me to launch programmatically my temporary maven project.
A nice point here, you could rely on eclipse variable (like ${system_path:mvn.bat})
//to be able to listen the end
manager.addLaunchListener(this);
ILaunchConfigurationType type = manager
.getLaunchConfigurationType("org.eclipse.ui.externaltools.ProgramLaunchConfigurationType");
ILaunchConfiguration[] configurations = manager
.getLaunchConfigurations(type);
for (int i = 0; i < configurations.length; i++) {
ILaunchConfiguration configuration = configurations[i];
if (configuration.getName().equals("Gen doc")) {
configuration.delete();
break;
}
}
ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(
null, "Gen doc");
String exec = "mvn.sh";
if (nameOS.toLowerCase().contains("win")) {
exec = "mvn.bat";
}
workingCopy.setAttribute(
"org.eclipse.ui.externaltools.ATTR_LOCATION",
"${system_path:" + exec + "}");
workingCopy.setAttribute(
"org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS",
"-Dlogback.configurationFile=genDoclogback.xml -U clean install exec:java");
workingCopy.setAttribute(
"org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY",
tmpGenDir.getCanonicalPath());
ILaunch launch = workingCopy.launch(ILaunchManager.RUN_MODE,
new NullProgressMonitor());
//to retreive the launched project at the end
launchProject.put(launch, project);
and to be able to listen the end of your launch configuration implement "ILaunchesListener2" and add
@Override
public void launchesTerminated(ILaunch[] launches) {
for (ILaunch launch : launches) {
Project project = launchProject.get(launch);
if (project != null) {
launchProject.remove(launch);
//if needed...
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
}
});
}
}
}
No comments:
Post a Comment