@TaskAction
  public void doTask() throws IOException, ParserConfigurationException, TransformerException {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    // root element
    Document doc = docBuilder.newDocument();
    Element root =
        addXml(
            doc,
            "launchConfiguration",
            ImmutableMap.of("type", "org.eclipse.jdt.launching.localJavaApplication"));

    addXml(
        root,
        "stringAttribute",
        ImmutableMap.of("key", "org.eclipse.jdt.launching.MAIN_TYPE", "value", getMainClass()));
    addXml(
        root,
        "stringAttribute",
        ImmutableMap.of(
            "key", "org.eclipse.jdt.launching.PROJECT_ATTR", "value", getProjectName()));
    addXml(
        root,
        "stringAttribute",
        ImmutableMap.of(
            "key", "org.eclipse.jdt.launching.WORKING_DIRECTORY", "value", getRunDir()));

    if (!Strings.isNullOrEmpty(getArguments())) {
      addXml(
          root,
          "stringAttribute",
          ImmutableMap.of(
              "key", "org.eclipse.jdt.launching.PROGRAM_ARGUMENTS", "value", getArguments()));
    }

    if (!Strings.isNullOrEmpty(getJvmArguments())) {
      addXml(
          root,
          "stringAttribute",
          ImmutableMap.of(
              "key", "org.eclipse.jdt.launching.VM_ARGUMENTS", "value", getJvmArguments()));
    }

    File outFile = getOutputFile();
    outFile.getParentFile().mkdirs();

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(getOutputFile());

    transformer.transform(source, result);

    // make the rundir
    new File(getRunDir()).mkdirs();
  }