docs: public synchronized static void init() {
      if (!isInitialized()) {
        if (processEngines == null) {
          // Create new map to store process-engines if current map is
          // null
          processEngines = new HashMap<String, ProcessEngine>();
        }
        ClassLoader classLoader = ReflectUtil.getClassLoader();
        Enumeration<URL> resources = null;
        try {
          resources = classLoader.getResources("activiti.cfg.xml");
        } catch (IOException e) {
          throw new ActivitiIllegalArgumentException("problem retrieving activiti.cfg.xml resources on the classpath: " + System.getProperty("java.class.path"), e);
        }
  
        // Remove duplicated configuration URL's using set. Some
        // classloaders may return identical URL's twice, causing duplicate
        // startups
        Set<URL> configUrls = new HashSet<URL>();
        while (resources.hasMoreElements()) {
          configUrls.add(resources.nextElement());
        }
        for (Iterator<URL> iterator = configUrls.iterator(); iterator.hasNext();) {
          URL resource = iterator.next();
          log.info("Initializing process engine using configuration '{}'", resource.toString());
          initProcessEngineFromResource(resource);
        }
  
        try {
          resources = classLoader.getResources("activiti-context.xml");
        } catch (IOException e) {
          throw new ActivitiIllegalArgumentException("problem retrieving activiti-context.xml resources on the classpath: " + System.getProperty("java.class.path"), e);
        }
        while (resources.hasMoreElements()) {
          URL resource = resources.nextElement();
          log.info("Initializing process engine using Spring configuration '{}'", resource.toString());
          initProcessEngineFromSpringResource(resource);
        }
  
        setInitialized(true);
      } else {
        log.info("Process engines already initialized");
      }
    }