docs: protected void execGroovy(final String txt, final PrintStream out) {
          log.debug("execGroovy()");
  
          // Check and ignore empty statements
          if ("".equals(txt.trim())) {
              return;
          }
  
          log.verbose("Script: " + txt);
          if (classpath != null) {
              log.debug("Explicit Classpath: " + classpath.toString());
          }
  
          if (fork) {
              log.debug("Using fork mode");
              try {
                  createClasspathParts();
                  createNewArgs(txt);
                  super.setFork(fork);
                  super.setClassname(useGroovyShell ? "groovy.lang.GroovyShell" : "org.codehaus.groovy.ant.Groovy");
                  configureCompiler();
                  super.execute();
              } catch (Exception e) {
                  Writer writer = new StringBuilderWriter();
                  new ErrorReporter(e, false).write(new PrintWriter(writer));
                  String message = writer.toString();
                  throw new BuildException("Script Failed: " + message, e, getLocation());
              }
              return;
          }
  
          Object mavenPom = null;
          final Project project = getProject();
          final ClassLoader baseClassLoader;
          ClassLoader savedLoader = null;
          final Thread thread = Thread.currentThread();
          boolean maven = "org.apache.commons.grant.GrantProject".equals(project.getClass().getName());
          // treat the case Ant is run through Maven, and
          if (maven) {
              if (contextClassLoader) {
                  throw new BuildException("Using setContextClassLoader not permitted when using Maven.", getLocation());
              }
              try {
                  final Object propsHandler = project.getClass().getMethod("getPropsHandler").invoke(project);
                  final Field contextField = propsHandler.getClass().getDeclaredField("context");
                  contextField.setAccessible(true);
                  final Object context = contextField.get(propsHandler);
                  mavenPom = InvokerHelper.invokeMethod(context, "getProject", EMPTY_OBJECT_ARRAY);
              }
              catch (Exception e) {
                  throw new BuildException("Impossible to retrieve Maven's Ant project: " + e.getMessage(), getLocation());
              }
              // load groovy into "root.maven" classloader instead of "root" so that
              // groovy script can access Maven classes
              baseClassLoader = mavenPom.getClass().getClassLoader();
          } else {
              baseClassLoader = GroovyShell.class.getClassLoader();
          }
          if (contextClassLoader || maven) {
              savedLoader = thread.getContextClassLoader();
              thread.setContextClassLoader(GroovyShell.class.getClassLoader());
          }
  
          final String scriptName = computeScriptName();
          final GroovyClassLoader classLoader =
                  AccessController.doPrivileged(
                          new PrivilegedAction<GroovyClassLoader>() {
                              @Override
                              public GroovyClassLoader run() {
                                  return new GroovyClassLoader(baseClassLoader);
                              }
                          });
          addClassPathes(classLoader);
          configureCompiler();
          final GroovyShell groovy = new GroovyShell(classLoader, new Binding(), configuration);
          try {
              parseAndRunScript(groovy, txt, mavenPom, scriptName, null, new AntBuilder(this));
          } finally {
              groovy.resetLoadedClasses();
              groovy.getClassLoader().clearCache();
              if (contextClassLoader || maven) thread.setContextClassLoader(savedLoader);
          }
      }