docs: @Override
      public void startAnt(final String[] args, final Properties additionalUserProperties, final ClassLoader coreLoader) {
          try {
              processArgs(args);
          } catch (final BuildException exc) {
              handleLogfile();
              printMessage(exc);
              exit(1);
              return;
          } catch (final RuntimeException e) {
              handleLogfile();
              e.printStackTrace();
              exit(1);
              return;
          } catch (final Throwable exc) {
              handleLogfile();
              printMessage(exc);
              exit(1);
              return;
          }
  
          if (!readyToRun) {
              return;
          }
  
          if (additionalUserProperties != null) {
              for (Map<String, Object> props : projectProps) {
                  for (final Enumeration<Object> e = additionalUserProperties.keys(); e.hasMoreElements(); ) {
                      final String key = (String) e.nextElement();
                      final String property = additionalUserProperties.getProperty(key);
                      props.put(key, property);
                  }
              }
          }
  
          // expect the worst
          int exitCode = 1;
          try {
              try {
                  for (Map<String, Object> props : projectProps) {
                      runBuild(coreLoader, props);
                  }
                  exitCode = 0;
              } catch (final ExitStatusException ese) {
                  exitCode = ese.getStatus();
                  if (exitCode != 0) {
                      throw ese;
                  }
              }
          } catch (final BuildException be) {
              if (err != System.err) {
                  printMessage(be);
              }
          } catch (final Throwable exc) {
              exc.printStackTrace();
              printMessage(exc);
          } finally {
              handleLogfile();
          }
          exit(exitCode);
      }