code: public Class<?>[] compile(String... sources)
  			throws CompilationFailedException, IOException {
  
  		this.loader.clearCache();
  		List<Class<?>> classes = new ArrayList<>();
  
  		CompilerConfiguration configuration = this.loader.getConfiguration();
  
  		CompilationUnit compilationUnit = new CompilationUnit(configuration, null,
  				this.loader);
  		ClassCollector collector = this.loader.createCollector(compilationUnit, null);
  		compilationUnit.setClassgenCallback(collector);
  
  		for (String source : sources) {
  			List<String> paths = ResourceUtils.getUrls(source, this.loader);
  			for (String path : paths) {
  				compilationUnit.addSource(new URL(path));
  			}
  		}
  
  		addAstTransformations(compilationUnit);
  
  		compilationUnit.compile(Phases.CLASS_GENERATION);
  		for (Object loadedClass : collector.getLoadedClasses()) {
  			classes.add((Class<?>) loadedClass);
  		}
  		ClassNode mainClassNode = MainClass.get(compilationUnit);
  
  		Class<?> mainClass = null;
  		for (Class<?> loadedClass : classes) {
  			if (mainClassNode.getName().equals(loadedClass.getName())) {
  				mainClass = loadedClass;
  			}
  		}
  		if (mainClass != null) {
  			classes.remove(mainClass);
  			classes.add(0, mainClass);
  		}
  
  		return ClassUtils.toClassArray(classes);
  	}
docs: Compile the specified Groovy sources, applying any
  {@link CompilerAutoConfiguration}s. All classes defined in the sources will be
  returned from this method.
  @param sources the sources to compile
  @return compiled classes
  @throws CompilationFailedException in case of compilation failures
  @throws IOException in case of I/O errors
  @throws CompilationFailedException in case of compilation errors